C中的预处理器命令是否算作标记?
我在读关于代币和计算程序中代币的数量 之前我在某个地方读到过,预处理器命令不算作标记。 但当我读到关于它上面的标记时,在“特殊符号”一节中给出了: 预处理器(#):预处理器是一个宏处理器,编译器会自动使用它在实际编译之前转换程序 所以我很困惑,在一个程序中,如果我们写C中的预处理器命令是否算作标记?,c,c-preprocessor,token,C,C Preprocessor,Token,我在读关于代币和计算程序中代币的数量 之前我在某个地方读到过,预处理器命令不算作标记。 但当我读到关于它上面的标记时,在“特殊符号”一节中给出了: 预处理器(#):预处理器是一个宏处理器,编译器会自动使用它在实际编译之前转换程序 所以我很困惑,在一个程序中,如果我们写#define,它会是一个令牌吗 例如: #include<stdio.h> #define max 100 int main() { printf("max is %d", max); ret
#define
,它会是一个令牌吗
例如:
#include<stdio.h>
#define max 100
int main()
{
printf("max is %d", max);
return 0;
}
#包括
#定义最大值100
int main()
{
printf(“最大值为%d”,最大值);
返回0;
}
本例中有多少标记?链接的文章充满了基本错误,不应依赖这些错误
解析C或C++的过程定义为一系列转换:1
if
是语言本身的if标记,但只是预处理器的IDENT标记#include<stdio.h>
#define max 100
int main()
{
printf("max is %d", max);
return 0;
}
其中“n”是许多来自stdio.h的代币
预处理指令(#include
,#define
,#if
,等等)总是从令牌流中删除,并且可能会被其他指令替换,因此在转换6之后,您永远不会有直接来自指令行文本的令牌。但是您通常会有由每个指令的效果产生的标记,例如stdio.h
的内容和DECIMAL-INTEGER:100
替换IDENT:max
最后,C和C++几乎是这样操作的,但不是完全相同,规格是形式上独立的。您通常可以依靠预处理操作在两种语言中表现相同,只要您只使用预处理器做简单的事情,这是当今的最佳实践
1,有时你会看到人们在谈论翻译阶段,这是C和C++标准正式描述这一系列操作的方式。我的清单不是翻译阶段的清单;它包括一些按标准分组为单个阶段的内容的单独要点,并省略了与本讨论无关的几个步骤。
没有c/c++语言。有效令牌是什么意思?关键词?极客换极客的文章充满了可疑的解释。我会忽略这篇文章。上一次我看到C++语法预处理器令牌和令牌是不同的,预处理器令牌不会算作令牌。我的意思是,这是不是简单的记数?请指定该程序中有多少令牌,以便我可以获得更好的性能knowledge@john“#”和“include”都是预处理器令牌。语言中唯一没有用某种标记定义的方面是注释、反斜杠换行符和三角图。PUNCT:# IDENT:include INCLUDE-ARG:<stdio.h>
PUNCT:# IDENT:define IDENT:max PP-NUMBER:100
IDENT:int IDENT:main PUNCT:( PUNCT:)
PUNCT:{
IDENT:printf PUNCT:( STRING:"max is %d" PUNCT:, IDENT:max PUNCT:) PUNCT:;
IDENT:return PP-NUMBER:0 PUNCT:;
PUNCT:}
[ ... some large volume of tokens produced from the contents of stdio.h ... ]
INT IDENT:main LPAREN RPAREN
LBRACE
IDENT:printf LPAREN STRING:"max is %d" COMMA DECIMAL-INTEGER:100 RPAREN SEMICOLON
RETURN DECIMAL-INTEGER:0 SEMICOLON
RBRACE