【问题标题】:Unable to resolve macro precedence in C?无法解析 C 中的宏优先级?
【发布时间】:2013-09-16 14:02:18
【问题描述】:

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

#define NAME(x) #x ## _bingo

现在将首先解决其中哪一个(###)?

我被困住了:)。我试图用谷歌搜索这种宏优先级。但是找不到任何相关的东西。

【问题讨论】:

  • 你想在这里实现什么?
  • 没什么,只是想学,可以当做实验!!

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


【解决方案1】:

现在将首先解决其中哪一个(# 和##)?

标准说:

16.3.2 # 运算符 [cpp.stringize]

2/ [...] ### 运算符的计算顺序未指定。

但是你想在这里实现什么?看来:

#define NAME(x) x ## _bingo

如果您想连接 x 令牌和 _bingo 就足够了。

例子:

NAME(foo)

将扩展为

foo_bingo

编辑:

如果你想用NAMEstringify生成的令牌,这里有一个例子说明你如何做到这一点(解决宏替换的问题 -> 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)

【讨论】:

  • 我想先连接然后字符串化?
  • @AmitBhaira:第二个宏:STRINGIFY(x ## _bingo)
  • 哦!非常感谢 :) 所以我一次只能解决一个,对吧?
  • @AmitBhaira @Mike Seymour 的STRINGIFY 示例非常完美,但您必须小心,因为STRINGIFY( NAME(foo) ) 不会按预期工作(标准的16.3.1 )。因为不会进行宏替换。看这里:ideone.com/zDfe1Q
  • @PierreFourgeaud 我在哪里可以找到您刚才提到的 16.3.2 的这些标准,您能否提供一个链接让我可以阅读所有这些标准?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多