当我们编写预处理器指令时,例如:
#define PI 3.1416
// Is PI is a macro or an identifier and how do we distinguish
// one from another?
答案 0 :(得分:1)
在您的示例中,PI
既是宏又是标识符。 “标识符”粗略地说是用于指定名称的语法的正式术语。宏,函数,名称空间,类型,变量都具有名称,并且所有这些名称都是使用标识符指定的。从上下文中应该清楚PI
是作为宏还是标识符:
上面将
PI
定义为3.1416
。
在这里,它用于引用宏。
PI
之后的#define
指定了宏的名称。
在这里,它用于引用标识符:它用于在源代码中引用指定宏名称的两个字符。
答案 1 :(得分:0)
接受的答案不准确。
通常,由 #define
预处理指令引入的标识符(作为预处理标记)是一个宏名称。这与宏本身不同。
预处理标记的标识符在翻译过程中的预处理阶段之后转换为标记。有两种令牌看起来与预处理令牌的标识符完全相同,即标识符和关键字。关键字是由语言的句法规则定义的,它们在转换后永远不是标识符。注意token的标识和预处理token的标识不同。
在给定的示例中,预处理标记 PI
将转换为标记 3.1416
。这既不是标识符也不是关键字(在 C 中,一个常量;在 C++ 中,一个文字)。从概念上讲,原始预处理标记不存在于转换后的翻译阶段。因此,它与转换后的令牌标识符不同。