标识符和宏有什么区别?

What is the difference between identifier and macro?

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

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

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

The above defines PI as 3.1416.

这里用来引用宏

The PI following the #define specifies the name of the macro.

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

接受的答案不准确。

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

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

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