将注释插入typename将产生错误

时间:2014-02-17 07:47:57

标签: c comments c-preprocessor

以下行写在C程序

in/*hello*/t k; error or not

据我所知,第一个预处理器会从代码中删除注释,然后代码将转到编译器,因此编译器的代码是

int k;

完全可以。

但实际上当我在gcc编译器上运行它时,它会给编译器错误

  

inkt未定义

3 个答案:

答案 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)

预处理器不会从代码中删除注释。它的作用是忽略评论中的任何内容,并阅读下一个有意义的字符,为评论添加一个空格(白色空格)。因此,您将收到错误,因为这些变量未定义。