如何使用宏本身的信息重新定义 C++ #define 宏?

How to redefine a C++ #define macro using information from the macro itself?

是否可以使用宏本身的信息重新定义 C++ #define 宏?我尝试了下面的代码,但由于宏的计算方式,输出不是我所期望的。

#include <iostream>

#define FINAL_DEFINE "ABC"
#define NEW_DEFINE FINAL_DEFINE "DEF" // Want ABCDEF

#undef FINAL_DEFINE
#define FINAL_DEFINE NEW_DEFINE // Want ABCDEF, but get empty?


int main ()
{
    std::cout << FINAL_DEFINE << std::endl; // Want ABCDEF, but doesn't compile.
}

如果您的编译器支持 push_macro & pop_macro pragma 指令,您可以这样做:

#include <iostream>

#define FINAL_DEFINE "ABC"
#define NEW_DEFINE FINAL_DEFINE "DEF"

int main ()
{
    std::cout << FINAL_DEFINE << std::endl; // Output ABC

    #pragma push_macro("FINAL_DEFINE")
    #define FINAL_DEFINE "XXX"
    std::cout << NEW_DEFINE << std::endl; // Output XXXDEF
    #pragma pop_macro("FINAL_DEFINE")
}

预处理后,代码中的所有 FINAL_DEFINE 将被替换为 最后定义的 ,然后进入编译步骤。

所以你不能随心所欲地重新定义宏。

您的编译器应该对此发出警告。

宏主体中的宏 从不 在定义宏时扩展 -- 仅在使用宏时。这意味着 NEW_DEFINE 的定义是 而不是 "ABC" "DEF",这正是 #define 行中出现的内容:FINAL_DEFINE "DEF".

因此,当您使用 FINAL_DEFINE 时,它会扩展为 NEW_DEFINE,然后扩展为 FINAL_DEFINE "DEF"。此时它不会递归扩展FINAL_DEFINE(因为这会导致无限循环)所以不再发生扩展。