以下行写在C程序
中in/*hello*/t k; error or not
据我所知,第一个预处理器会从代码中删除注释,然后代码将转到编译器,因此编译器的代码是
int k;
完全可以。
但实际上当我在gcc编译器上运行它时,它会给编译器错误
in
,k
,t
未定义
答案 0 :(得分:9)
编译器中的注释将被编译器替换为空格。所以
in/*hello*/t k;
将成为
in t k;
这是不正确的。
C11§5.1.1.2翻译阶段
3源文件被分解为预处理标记和空白字符序列(包括注释)。源文件不应以部分预处理标记或部分注释结束。 每个评论都替换为一个空格字符。保留换行符。是否保留或替换为新行以外的每个非空白字符序列是由实现定义的。
答案 1 :(得分:3)
从C11开始5.1.1.2翻译阶段(我的重点)
源文件被分解为预处理令牌和 空白字符序列(包括注释)。来源 文件不得以部分预处理令牌或部分预处理结束 评论。 每个评论都被一个空格字符替换
因此,正如余浩所说,你的评论被预处理器替换为空格。您可以使用gcc -R your_file.c
(gcc)或cl /EP your_file.c
(msvc)自行测试,以查看预处理器的输出。
答案 2 :(得分:1)
预处理器不会从代码中删除注释。它的作用是忽略评论中的任何内容,并阅读下一个有意义的字符,为评论添加一个空格(白色空格)。因此,您将收到错误,因为这些变量未定义。