我试图编写一个简单的 C 程序。这里我定义了一个宏。
#define NAME(x) #x ## _bingo
现在将首先解决其中的哪一个(#
和)?##
我被困住了:)。我试图用谷歌搜索这种宏优先级。但是找不到任何相关的东西。
我试图编写一个简单的 C 程序。这里我定义了一个宏。
#define NAME(x) #x ## _bingo
现在将首先解决其中的哪一个(#
和)?##
我被困住了:)。我试图用谷歌搜索这种宏优先级。但是找不到任何相关的东西。
现在将首先解决其中哪一个(# 和##)?
标准说:
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)