如何使用宏本身的信息重新定义 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
(因为这会导致无限循环)所以不再发生扩展。
是否可以使用宏本身的信息重新定义 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
(因为这会导致无限循环)所以不再发生扩展。