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

时间:2013-09-12 09:03:52

标签: c visual-c++ c-preprocessor

我正在尝试编写一个简单的C程序。我在这里定义了一个宏。

#define NAME(x) #x ## _bingo

现在首先解决它们中的哪一个(###)?

我被卡住了:)。我试图谷歌关于这样的宏优先权。但找不到任何相关的东西。

1 个答案:

答案 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)