如果我有一个代码,比如
int main()
{
i/* this is me*/nt a=9;
printf("%d",a);
getch();
return 0;
}
如果我试图在标记int中使用注释,那么它会产生什么问题,从而显示错误。当在词法阶段,词法分析器只将字符流转换为标记,并删除所有注释时,编译器会出现什么问题,那么这里的问题是什么?
参见C11标准中的5.1.1.2/3
每个注释都替换为一个空格字符。
因为指定了C语言来禁止这种情况。直觉上,评论就像空间一样。您可以想象编译器将每个注释解析为一个空间。
您可能对预处理器的替换能力感兴趣。阅读它的串联&字符串化能力(在宏内部)。
禁止在词法标记内注释还有一个实用的原因:这会使源代码非常不可读。
此外,允许在令牌中添加注释可能会使解析器的速度变慢。
我知道没有任何编程语言接受令牌内的注释
在20世纪70年代&20世纪80年代,大多数C编译器有效地运行了一个单独的预处理器进程(/lib/cpp
),该进程生成一个预处理文件,该文件由真正的编译器解析(cc1
,生成汇编文件)。如今,预处理器实际上是cc1
编译器的一部分(在GCC中,它是libcpp/
内部库)——由于产生了一个虚拟的令牌流,因此以某种方式作为lexer工作——并且通常不会将预处理的文件写入磁盘。