标识符和宏有什么区别?

时间:2018-06-28 06:27:48

标签: 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?

2 个答案:

答案 0 :(得分:1)

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

  

上面将PI定义为3.1416

在这里,它用于引用宏。

  

PI之后的#define指定了宏的名称。

在这里,它用于引用标识符:它用于在源代码中引用指定宏名称的两个字符。

答案 1 :(得分:0)

接受的答案不准确。

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

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

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