gpt4 book ai didi

c++ - 绕过#define'd 宏?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:32 25 4
gpt4 key购买 nike

假设你有宏

#define TOKEN1 <arbitrary sequence of characters>

但是假设,在某些情况下,您真正​​指的是 TOKEN1,而不是它被定义的内容。是否有一种技巧允许预处理文件包含“TOKEN1”,而无需#undef'ining TOKEN1,并且在#define'd 之后出现 TOKEN1?

上下文:

我正在通过重新定义 new 来添加内存跟踪。但是,我遇到了一个问题,我在几个类中也重载了 operator new,而且不得不在所有这些地方取消定义 new,然后重新包含执行魔术后。

最佳答案

一般的方法是将所有具有“不替换 TOKEN1”要求的代码放入一个单独的源文件中,然后不将定义替换的头文件包含到该文件中。

如果任意字符序列是单个标记(就像您编辑问题之前一样),您可以这样做:

#define TOKEN2 TOKEN1
if (you_really_mean(TOKEN1)) {
//...
}
#undef TOKEN2

但是,这个解决方案是有限的,因为如果 TOKEN2 之前已经被重新定义为其他东西,您就会遇到问题。

如果您可以完全控制定义的内容和未定义的内容,您可以这样做:

#define TOKEN1 TOKEN2
#define TOKEN2 <arbitrary sequence formerly assigned to TOKEN1>

然后,在你的代码中转义TOKEN1:

#undef TOKEN1
//... code where you don't want TOKEN1 replaced
#define TOKEN1 TOKEN2

对于处理重载 new 的特殊问题,我发现在很大程度上,重载的 new 实现大部分是相同的(因为它们通常只是样板代码,将分配器更改为使用系统堆以外的东西)。如果您也是这种情况,您可以将重载定义放入一个不 protected 头文件中。这个头文件可以#undef定义new,然后在重载定义后重新定义一遍。

那么任何类都可以包含这个头文件。

关于c++ - 绕过#define'd 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24877866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com