无法解决C中的宏优先级?

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)

  • @AmitBhaira:第二个宏:`STRINGIFY(x ## _bingo)` (3认同)
  • @AmitBhaira @Mike Seymour的'STRINGIFY'示例完美,但你必须小心,因为`STRINGIFY(NAME(foo))`将不会按预期工作(标准*的*16.3.1).因为不会进行宏替换.看看这里:http://ideone.com/zDfe1Q (2认同)