Ami*_*ira 7 c visual-c++ c-preprocessor
我试着写一个简单的C程序.在这里我定义了一个宏.
#define NAME(x) #x ## _bingo
Run Code Online (Sandbox Code Playgroud)
现在首先要解决哪一个(#和##)?
我被卡住了:).我试图谷歌关于这样的宏优先权.但找不到任何相关的东西.
Pie*_*aud 11
现在哪一个(#和##)首先要解决?
标准说:
16.3.2#运算符[cpp.stringize]
2/[...] 未指定评估
#和##运营商的顺序.
但是你想在这里实现什么?看起来:
#define NAME(x) x ## _bingo
Run Code Online (Sandbox Code Playgroud)
如果你想连接x令牌就足够了_bingo.
例:
NAME(foo)
Run Code Online (Sandbox Code Playgroud)
将扩大为
foo_bingo
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你想用宏将字符串化生成的令牌NAME,这里有一个如何做到这一点的例子(解决宏替换的问题 - > 标准的16.3.1):
#define NAME(x) x##_bingo
// Converts the parameter x to a string after macro replacement
// on x has been performed if needed.
#define STRINGIFY(x) DO_STRINGIFY(x)
#define DO_STRINGIFY(x) #x
int main() {
std::string n = STRINGIFY( NAME( foo ) );
std::string n2 = DO_STRINGIFY( NAME(foo) );
// Will print foo_bingo as expected
std::cout << n << std::endl;
// Will print NAME( foo ) because the macro NAME is not expanded
std::cout << n2 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
foo_bingo
NAME(foo)
Run Code Online (Sandbox Code Playgroud)