【问题标题】:Definition of macro to create two parameters from one value定义宏以从一个值创建两个参数
【发布时间】:2018-04-13 07:15:26
【问题描述】:

我有这个定义:

using ToolTipMap = std::map<UINT, UINT>;
using ToolTipPair = std::pair<UINT, UINT>;

我是这样使用的:

ToolTipMap mapToolTips;
mapToolTips.insert(ToolTipPair(IDC_COMBO_WATCHTOWER_DAY, IDS_COMBO_WATCHTOWER_DAY));
mapToolTips.insert(ToolTipPair(IDC_COMBO_SCHOOL_DAY, IDS_COMBO_SCHOOL_DAY));
mapToolTips.insert(ToolTipPair(IDC_EDIT_DATE_FORMAT, IDS_EDIT_DATE_FORMAT));
mapToolTips.insert(ToolTipPair(IDC_CHECK_USE_CUSTOM_DATE, IDS_CHECK_USE_CUSTOM_DATE));
mapToolTips.insert(ToolTipPair(IDC_CHECK_PLATFORM, IDS_CHECK_PLATFORM));
mapToolTips.insert(ToolTipPair(IDC_CHECK_PLATFORM_MIKE, IDS_CHECK_PLATFORM_MIKE));
mapToolTips.insert(ToolTipPair(IDC_COMBO_NUM_MIKE_USERS, IDS_COMBO_NUM_MIKE_USERS));
mapToolTips.insert(ToolTipPair(IDC_COMBO_NUM_SOUND_USERS, IDS_COMBO_NUM_SOUND_USERS));
mapToolTips.insert(ToolTipPair(IDC_COMBO_NUM_ATTEND, IDS_COMBO_NUM_ATTEND));
mapToolTips.insert(ToolTipPair(IDC_BUTTON_HELP, IDS_BUTTON_HELP));
mapToolTips.insert(ToolTipPair(IDC_COMBO_REPORT_MODE, IDS_COMBO_REPORT_MODE));
mapToolTips.insert(ToolTipPair(IDC_COMBO_WEEKLY_DAY, IDS_COMBO_WEEKLY_DAY));

如何简化这一点:

IDC_COMBO_WATCHTOWER_DAY, IDS_COMBO_WATCHTOWER_DAY

所以我只是指定:

COMBO_WATCHTOWER_DAY

并用宏扩展为两者?


我明白了:

  • # 将参数转换为文本字符串
  • ##结合了两个参数

所以:

TOOLTIP(a) _T(“IDC_”)#a _T(“IDS_”)#a

【问题讨论】:

    标签: c++ macros mfc


    【解决方案1】:

    你可以使用std::map::emplace来简化代码,例子

    ToolTipMap.emplace(1, 2);
    

    或者使用ToolTipMap.insert({ 1, 2 });来避免std::pair的需要

    使用#define foo(x) IDC_##x, IDS_##x 作为IDC_x, IDS_x 的快捷方式

    #include <iostream>
    #include <map>
    
    #define IDC_X1 1
    #define IDS_X1 1000
    
    #define IDC_X2 2
    #define IDS_X2 2000
    
    int main()
    {
        std::map<int, int> ToolTipMap;
    
    #define foo(x) IDC_##x, IDS_##x
        ToolTipMap.emplace(foo(X1));
        ToolTipMap.emplace(foo(X2));
    #undef foo
    
        for (const auto &e : ToolTipMap)
            std::cout << e.first << ", " << e.second << "\n";
    
        return 0;
    }
    

    如果您没有更多这些常量,我建议您保留代码原样。您无需复杂的宏即可复制/粘贴行。最终的代码大小将是相同的,因此不会有任何收获或损失。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多