【发布时间】: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
当我们编写预处理指令时,例如:
#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
在您的示例中,PI 既是宏又是标识符。 “标识符”粗略地说是指定名称的语法的正式术语。宏、函数、命名空间、类型、变量都有名称,并且所有这些名称都使用标识符指定。从上下文中应该清楚 PI 是作为宏还是作为标识符:
上面将
PI定义为3.1416。
这里用来指代宏。
#define后面的PI指定宏的名称。
这里用来指代标识符:用来指代源代码中指定宏名的两个字符。
【讨论】:
接受的答案不准确。
通常,#define 预处理指令引入的标识符(作为预处理标记)是一个宏名称。这与宏本身不同。
预处理标记的标识符在翻译过程中的预处理阶段之后转换为标记。有两种令牌看起来与预处理令牌的标识符完全一样,即标识符和关键字。关键字是由语言的句法规则定义的,在转换后它们永远不会是标识符。注意token的标识符和预处理token的标识符不同。
在给定的示例中,预处理标记PI 将转换为标记3.1416。这既不是标识符也不是关键字(在 C 中,是常量;在 C++ 中,是文字)。从概念上讲,转换后的翻译阶段中不存在原始预处理标记。因此,它与转换后的token标识符有区别。
【讨论】: