我正在尝试编写一个简单的C程序。我在这里定义了一个宏。
#define NAME(x) #x ## _bingo
现在首先解决它们中的哪一个(#
和##
)?
我被卡住了:)。我试图谷歌关于这样的宏优先权。但找不到任何相关的东西。
答案 0 :(得分:11)
现在首先解决它们中的哪一个(#和##)?
标准说:
16.3.2#运算符[cpp.stringize]
2 / [...]
#
和##
运算符的评估顺序未指定。
但是你想在这里实现什么?看来:
#define NAME(x) x ## _bingo
如果您想要连接x
令牌和_bingo
,那就足够了。
示例:
NAME(foo)
将扩展为
foo_bingo
编辑:
如果你想用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;
}
输出:
foo_bingo
NAME(foo)