在学习c时,我得到了我的第一个主题,即代币。当我查看此代码时,很容易获取图片。
int main()
{
int x, y, total;
x = 10, y = 20;
total = x + y;
printf ("Total = %d n", total);
}
到目前为止很好...现在当我在这里看这个:
#include <stdio.h>
int main()
{
/* code */
printf("Hello C world! n");
return 0;
}
我想知道#include <stdio.h>
中的#include
是否是令牌。如果是,它应该是关键字?
在行中
#include <stdio.h>
#include
是处理前指令。<stdio.h>
是预处理器的其他信息。在这种情况下,它指定了文件名stdio.h
,其内容应包括在要编译的文件的该文件的位置。
包含专业处理器指令的行是由预处理器处理的,并且编译器从源代码创建对象代码时从未见过。
根据最新的在线草稿标准,第6.4.1节:
,这是C关键字的列表auto if unsigned
break inline void
case int volatile
char long while
const register _Alignas
continue restrict _Alignof
default return _Atomic
do short _Bool
double signed _Complex
else sizeof _Generic
enum static _Imaginary
extern struct _Noreturn
float switch _Static_assert
for typedef _Thread_local
goto union
#include
指令不是C语言 grammar 的一部分。这是一项预处理指令,已从源文本中删除到编译器之前从源文本中删除。
这是将C代码从源文本转换为机器代码(第5.1.1.2节)的阶段,对预处理器指令的一些额外强调:
物理源文件在实现定义的方式,到源字符集(引入新线字符在线指标)如有必要。Trigraph序列被取代相应的单个字符内部表示。
backslash字符(
)的每个实例紧随其后的是新线删除字符,拼接物理源线以形成逻辑源线。任何物理源线上的最后一个反斜线才有资格成为一部分这样的剪接。一个不是空的源文件应以新线字符结束,在此类之前,该角色不应紧随其后剪接发生。
源文件被分解为预处理令牌 7)和序列白空间字符(包括评论)。源文件不得以部分预处理令牌或部分评论。每个评论被取代一个空间特征。保留新的字符。是否每个非空除了新线以外的白色空间字符的顺序被保留或取代一个空间字符是实现定义的。
执行预处理指令,扩展宏观调查,并且
_Pragma
单位操作员表达式执行。如果字符序列匹配通用字符名称的语法是由令牌产生的串联(6.10.3.3),行为不确定。#include
预处理指令导致命名标头或源文件从阶段1处理通过第4阶段,递归。然后删除所有预处理指令。每个源字符集成员和角色常数中的逃脱顺序字符串文字转换为执行字符的相应成员放;如果没有相应的成员,则将其转换为实现定义除空字符以外的成员。 8)
相邻字符串字面令牌是串联的。
分隔令牌的白空间字符不再显着。每个预处理令牌被转换为令牌。由此产生的令牌是句法和语义分析和翻译为翻译单元。
所有外部对象和功能引用均已解决。库组件是链接到满足对功能和对象未定义的对象的外部引用当前翻译。所有此类翻译器的输出都收集到程序图像中其中包含在执行环境中执行所需的信息。
基本上,第1至4阶段描述了预处理器的动作。这基本上是在编译器翻译之前按摩源文本。
您需要阅读第6.4节,以了解预处理器令牌和常规令牌之间的差异。