预处理器符号是一个名称。没有预处理指令可以更改名称本身,同时保留内容。例如,给定以下任一内容:
#define FOO 42
或者
#define FOO(x, y) x ## y (
没有办法定义一个名为BAR
的宏,其内容相同,而不重复这些定义。也就是说,没有像下面这样的操作:
#alias BAR FOO // nonexistent fantasy macro-cloning preprocessor directive
不要像这样:
#rename BAR FOO // like #alias BAR FOO followed by #undef FOO
如果我们这样做:
#define BAR FOO // for the #define FOO 42 case
这不是别名。宏BAR
的定义使其替换令牌序列为令牌FOO
,而不是42
。如果FOO
宏消失,则BAR
将失去其含义。
还要注意,C预处理器宏不能扩展为预处理指令,因此以下方法也不起作用:
// wrong:
MACRO_DEFINER(FOO) // hoping for
MACRO_DEFINER(BAR) // hoping for
恐怕你需要退回几步,找到另一种解决问题的策略。如果卡住了,可以创建一个关于实际问题的新问题。
总是有代码生成:在构建时生成 C 或 C++ 代码。然后,如果您只调整生成系统,您可以梦想中的任何文本替换或扩展都是可能的。
任何涉及 #undef XYZ
的解决方案都会破坏库头文件的功能。库可能会做这样的事情:
#define XYZ 42
#define macro(B) bloop(XYZ, B)
如果我们使用 macro
,那么如果重新定义 XYZ
,我们就会破坏它。
如果该库已知定义了 XYZ
,并且我们成功地在使用该库的代码中重新定义了它,则对未来的维护者来说,情况将会令人困惑。"哦,这个 XYZ
实际上不是那个库里的;这个程序员只是想要一个无关的 XYZ
。"
最好的解决方案是停止想要使用 XYZ
并找到其他名称。适应您正在使用的库;不要与它们冲突。