【发布时间】:2014-09-12 17:05:24
【问题描述】:
假设你有宏
#define TOKEN1 <arbitrary sequence of characters>
但是假设,在某些情况下,您的真正意思是 TOKEN1,而不是它的定义。有没有一个技巧可以让预处理文件包含“TOKEN1”,而不用#undef'ining TOKEN1,并且在#define'd之后出现TOKEN1?
上下文:
我正在通过重新定义new 来添加内存跟踪。但是,我遇到了一个问题,我在几个类中也重载了operator new,并且不得不在所有这些地方取消定义 new ,然后重新包含具有魔力的标头是很尴尬的。
【问题讨论】:
-
没办法,在编译之前预处理器会盲目地替换文本,所以如果你不
#undef它,你不能要求编译器忽略预处理器。 -
@vsoftco 没有办法编写一个评估为 TOKEN1 的宏,而预处理器不会评估它?
-
好吧,我猜你可以做
#define TOKEN2 TOKEN1,然后当你写TOKEN1时,预处理器会用TOKEN2替换它,然后用TOKEN1替换它,此时它将停止替换... -
@T.C.:看起来你在我回答的同时发表了这条评论。请注意,只要
TOKEN2尚未重新定义为其他内容,它就可以工作。 -
因此对于宏和实际语言标识符使用不同命名约定的通用编码约定。
标签: c++ c c-preprocessor