宏是简单的替换。因此,无论您在 EVENT_TYPE 的 arg 中放入什么,都将在右侧事件列表中看到“DO”的地方替换。例如,EVENT_TYPE( GUI ) 将替换为:
GUI(EVENT_UNKNOWN), GUI(EVENT_SIP), GUI(EVENT_MEDIA), \
GUI(EVENT_APP), GUI(EVENT_TIMER), GUI(EVENT_BREAK), \
GUI(EVENT_STOP), GUI(EVENT_MAX)
这可能是为了与其他宏一起使用,以便GUI(或其中的任何内容)本身就是一个宏,可以做一些事情,比如说,预先添加一个命名空间(所以第一个元素变成 MyNamespace ::MyUI::EVENT_UNKNOWN)或连接标识符字符串(因此第一个元素变为 GUI_EVENT_UNKNOWN)。
更新:
根据您的评论:
#define STRINGIFY(VAR) #VAR
用你放在 var 中的任何内容创建一个字符串。通常这将是一个变量名,但它也可以是一个表达式。所以预处理器会变形:
int i = 42;
std::cout << STRINGIFY(i) << " = " << i << '\n'
<< STRINGIFY(i+1) << " = " << i+1 << '\n';
进入
int i = 42;
std::cout << "i" << " = " << i << '\n'
<< "i+1" << " = " << i+1 << '\n';
将打印:
i = 42
i+1 = 43
你也可以做符号连接:
#define CONCAT(X) prefix_##X##_suffix
int CONCAT(myVar) = 42;
会变成:
int prefix_myVar_suffix = 42;
您也可以进行字符串连接,但我将把它作为练习留给读者。