如果我有代码,比如
int main()
{
i/* this is me*/nt a=9;
printf("%d",a);
getch();
return 0;
}
这里如果我尝试在令牌int中使用注释那么它创建了什么问题,因为它显示错误。在词法阶段,编译器出现问题时,词法分析器只是将字符流转换为令牌,它会删除所有注释,那么这里的问题是什么?
答案 0 :(得分:9)
请参阅5.1.1.2/3 in the C11 Standard
每个评论都被一个空格字符替换。
答案 1 :(得分:3)
因为指定C语言禁止这样做。直观地说,评论是空间的。您可以想象编译器将每个注释解析为空格。
您可能对preprocessor replacement能力感兴趣。阅读其concatenation& stringification能力(在宏内)。
还有一个实用的理由禁止内部词法标记:它会使人类的源代码非常难以理解。
此外,允许在令牌内部发表评论可能会使解析器变慢。
我知道没有编程语言接受令牌内的评论。
在20世纪70年代和20世纪80年代,大多数C编译器有效地运行一个单独的预处理器进程(/lib/cpp
),该进程生成一个预处理文件,该文件由真实编译器(cc1
解析,生成汇编程序文件)。今天,预处理器实际上是cc1
编译器的一部分(在GCC中它是libcpp/
内部库) - 作为词法分析器工作,因为生成了一个虚拟的标记流 - 并且没有预处理文件通常写入磁盘。