c-为什么不能在令牌中使用注释



如果我有一个代码,比如

 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工作——并且通常不会将预处理的文件写入磁盘。

最新更新