C99,“尽管名称,非指令是一个预处理指令。”

时间:2011-04-15 15:44:05

标签: c c-preprocessor c99

标题中引用的脚注是什么意思?这是6.10.3p11附加的脚注

  

如果参数列表中有预处理令牌序列,否则它们将充当预处理指令, 147)行为未定义。

我检查了一下

  

预处理指令由一系列预处理令牌组成,这些令牌以#预处理令牌开头......

我没有找到匹配该语法的非终端non-directive。它可以但不必以#预处理令牌开头。那么我们不得不说以下内容吗?

  

“尽管名称,预处理指令是非指令。”

此外,该脚注的目的是什么?

2 个答案:

答案 0 :(得分:7)

http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_250.htm这是为了澄清

#define nothing(x) // Nothing    /* Case 1 */
nothing (
#nonstandard
)

是UB。

答案 1 :(得分:4)

我的C99副本没有那个脚注(它是原始的 - 你有没有应用TR修正?)但我认为这个想法是,如果你有

# non-directive

在宏参数列表中,仍然是未定义的行为。

最好使< 非指令性>生产包括#,我认为,它会简化6.10p3,4以及消除这种混乱。