【问题标题】:Placemarker and non-placemarker tokens in pre-processor?预处理器中的地标和非地标标记?
【发布时间】:2012-11-26 12:13:48
【问题描述】:

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 多次,但仍然对这些技术名称感到困惑。

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

【问题讨论】:

    标签: c macros c-preprocessor c99


    【解决方案1】:

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

    如果在类函数宏的替换列表中,一个参数紧跟在前面 或者后跟一个##预处理令牌,参数替换为对应的 参数的预处理标记序列;但是,如果一个论点由 no 组成 预处理标记,参数被替换为 placemarker 预处理标记 145)

    还有脚注:

    145) Placemarker 预处理标记不会出现在语法中,因为它们是临时实体 仅存在于翻译阶段 4。

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

    【讨论】:

    • 是的,你引用的很好,但我的问题很清楚,什么是 placemaker 和 non-placemaker 令牌。它只是写成:"however, if an argument consists of no preprocessing tokens, the parameter is replaced by a placemarker preprocessing token instead",但它没有提到 placemaker。
    • 还有"behaviour is undefined""undefined behaviours " 它们是不同的吗?
    • 首先,它是“placemarker”,而不是“placemaker”。其次,仅此而已:一个特殊的标记,用于标记不包含标记的参数在何处展开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多