是否可以使用宏本身的信息重新定义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.
}
答案 0 :(得分:1)
在定义宏时,宏体中的宏从不展开 - 仅在使用宏时。这意味着NEW_DEFINE
的定义不 "ABC" "DEF"
,它正好出现在#define行:FINAL_DEFINE "DEF"
。
因此,当您使用FINAL_DEFINE
时,会扩展为NEW_DEFINE
,然后展开到FINAL_DEFINE "DEF"
。此时它不会递归地扩展FINAL_DEFINE
(因为这将导致无限循环),因此不再发生扩展。
答案 1 :(得分:0)
如果您的编译器支持push_macro
&amp; 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")
}
答案 2 :(得分:0)
预处理后,代码中的所有FINAL_DEFINE
将替换为其定义的最后一件,然后进入编译步骤。
所以你不能像你想要的那样重新定义宏。
您的编译器应该警告您。