C++ 标识符和宏之间有什么区别?

C++ 标识符和宏之间有什么区别?,c++,data-structures,macros,identifier,preprocessor,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? 在您的示例中,PI既是宏又是标识符。“Identifier”粗略地说是指定名称的语法的正式术语。宏、函数、名称空间、类型、变量都有名称,所有这些名称都是使用标识符指定的。从上下文中可以清楚地看出,PI是作为宏还是作为标识符: 上面将PI定义为3.141

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

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

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

上面将
PI
定义为
3.1416

在这里,它用于指代宏

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


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

接受的答案不准确

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

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


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

如果我写#define PI,PI会叫什么?@J.Smith,答案完全相同,原因完全相同。