Vig*_*and 6 c c++ c-preprocessor
假设你有宏
#define TOKEN1 <arbitrary sequence of characters>
Run Code Online (Sandbox Code Playgroud)
但是,假设在某些情况下,你真的是指TOKEN1,而不是它的定义.是否有一个技巧允许预处理文件包含"TOKEN1",没有#unf'ining TOKEN1,并且TOKEN1出现在#define'd之后?
语境:
我正在通过重新定义来添加内存跟踪new.但是,我遇到的问题是我也在operator new几个类中重载了,并且在所有这些地方都必须取消定义新的,然后重新包含执行魔术之后的标题是很尴尬的.
一般方法是将所有具有“不替换 TOKEN1”要求的代码放入单个源文件中,然后不将定义替换的头文件包含到该文件中。
如果任意字符序列是单个标记(就像在编辑问题之前一样),您可以执行以下操作:
#define TOKEN2 TOKEN1
if (you_really_mean(TOKEN1)) {
//...
}
#undef TOKEN2
Run Code Online (Sandbox Code Playgroud)
TOKEN2但是,这个解决方案是有限的,因为如果之前已经被重新定义为其他东西,你就会遇到问题。
如果您可以完全控制正在定义的内容和未定义的内容,则可以执行以下操作:
#define TOKEN1 TOKEN2
#define TOKEN2 <arbitrary sequence formerly assigned to TOKEN1>
Run Code Online (Sandbox Code Playgroud)
然后,在您的代码中进行转义TOKEN1:
#undef TOKEN1
//... code where you don't want TOKEN1 replaced
#define TOKEN1 TOKEN2
Run Code Online (Sandbox Code Playgroud)
对于处理重载的特定问题new,我发现在很大程度上,重载new实现大多是相同的(因为它们通常只是样板代码,更改分配器以使用系统堆以外的东西)。如果您也是这种情况,您可以将重载定义放入不受保护的头文件中。这个头文件可以#undef定义new,然后在重载定义之后再次重新定义。
那么任何类都可以包含这个头文件。
| 归档时间: |
|
| 查看次数: |
376 次 |
| 最近记录: |