【问题标题】:What is the difference between identifier and macro?标识符和宏有什么区别?
【发布时间】:2018-06-28 06:27:47
【问题描述】:

当我们编写预处理指令时,例如:

#define PI 3.1416    
// Is PI is a macro or an identifier and how do we distinguish
// one from another?

【问题讨论】:

    标签: c++ data-structures macros identifier preprocessor


    【解决方案1】:

    在您的示例中,PI 既是宏又是标识符。 “标识符”粗略地说是指定名称的语法的正式术语。宏、函数、命名空间、类型、变量都有名称,并且所有这些名称都使用标识符指定。从上下文中应该清楚 PI 是作为宏还是作为标识符:

    上面将PI定义为3.1416。

    这里用来指代宏。

    #define 后面的 PI 指定宏的名称。

    这里用来指代标识符:用来指代源代码中指定宏名的两个字符。

    【讨论】:

    • 如果我写#define PI 会怎样?
    • @J.Smith 答案完全相同,原因完全相同。
    【解决方案2】:

    接受的答案不准确。

    通常,#define 预处理指令引入的标识符(作为预处理标记)是一个宏名称。这与宏本身不同。

    预处理标记的标识符在翻译过程中的预处理阶段之后转换为标记。有两种令牌看起来与预处理令牌的标识符完全一样,即标识符和关键字。关键字是由语言的句法规则定义的,在转换后它们永远不会是标识符。注意token的标识符和预处理token的标识符不同。

    在给定的示例中,预处理标记PI 将转换为标记3.1416。这既不是标识符也不是关键字(在 C 中,是常量;在 C++ 中,是文字)。从概念上讲,转换后的翻译阶段中不存在原始预处理标记。因此,它与转换后的token标识符有区别。

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 2019-09-10
      • 2014-03-24
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多