预处理器中的地标和非地标标记?

时间:2012-11-26 12:13:49

标签: c macros c-preprocessor c99

C99标准并且无法理解这一点:

c99 - 6.10.3.3  
Semantics 
3

---(第二句)

Placemarker preprocessing tokens是专门处理的:两个地方标记的连接导致单个地标标记预处理标记,以及地标标记的连接 使用non-placemarker preprocessing token会导致非地标标记预处理令牌。

如果结果不是有效的预处理标记,则行为未定义。

1.What does this `placemarker` and `non-placemarker` term mean exactly?
2.Why the last line says : `undefined behaviour` ?

我已阅读了10多次,但仍然对这些技术名称感到困惑。

任何有关示例和解释的帮助都会对我有所帮助。

1 个答案:

答案 0 :(得分:3)

地标标记在前一段(6.10.3.2)中定义:

  

如果在类似函数的宏的替换列表中,紧跟在前面的参数   或者后跟一个##预处理令牌,该参数将被相应的替换   参数的预处理标记序列;但是,如果参数包含否   预处理令牌,参数由 placemarker 预处理令牌替换   代替。 145)

脚注:

  

145)地标预处理令牌没有出现在语法中,因为它们是临时实体   仅存在于翻译阶段4中。

你引用的最后一行并没有说“未定义的行为”,它说“行为未定义”。我不确定你在这里寻找什么样的答案。它之所以如此,是因为该标准的作者决定如此。