DD.*_*DD. 103 c macros concatenation token
我想创建一个C宏,它创建一个名称基于行号的函数.我以为我可以做类似的事情(真正的函数会在括号内有声明):
#define UNIQUE static void Unique_##__LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
我希望将扩展到以下内容:
static void Unique_23(void) {}
Run Code Online (Sandbox Code Playgroud)
这不起作用.使用令牌连接,定位宏按字面处理,最终扩展为:
static void Unique___LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
(是的,无论这看起来多么无用,我都有一个真正的理由要这样做).
Ada*_*eld 169
问题是当你有一个宏替换时,如果字符串化操作符#
和令牌粘贴操作符##
都没有应用于它,预处理器将只递归地扩展宏.因此,您必须使用一些额外的间接层,您可以使用带有递归扩展参数的token-pasting运算符:
#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) {}
Run Code Online (Sandbox Code Playgroud)
然后,__LINE__
在扩展期间扩展到行号UNIQUE
(因为它不涉及任何#
或者##
),然后在扩展期间发生令牌粘贴TOKENPASTE
.
还应该注意的是,还有__COUNTER__
宏,每次计算时都会扩展为一个新的整数,以防你需要UNIQUE
在同一行上有多个宏的实例化.注意:__COUNTER__
MS Visual Studio,GCC(自V4.3起)和Clang支持,但不是标准C.
归档时间: |
|
查看次数: |
58933 次 |
最近记录: |