为什么我不能在我的C代码中使用//-风格的注释?

39

我正在使用gcc (Ubuntu 4.4.1-4ubuntu9)编译我的程序,但是每当它在我的代码中看到//注释时就会出现错误信息:

interface.c :##: error: expected expression before â/â token<

我使用的 gcc 编译模式是否禁止 // 注释?

$ gcc -g -ansi -pedantic interface.c structs.h -c -I. -I/home/me/project/h
为什么?

5
重要的是要认识到,“ANSI C”这个术语通常(并且错误地)用来指代1989年ANSI C标准所描述的语言。该标准已被1990年ISO C标准(描述相同的语言)所取代,并且自那时以来已被1999年和2011年的ISO C标准所取代。在它们出版后,ANSI正式采用了所有三个ISO C标准。因此,严格来说,“ANSI C”指的是ISO C 2011——更清楚地称为“ISO C”。旧标准仍然可能相关,但最好按年份(C89/C90、C99、C11)来引用它们。 - Keith Thompson
ANSI C 可以指任何美国采用 ISO C 的版本... 因此 ANSI ISO/IEC 9899:2011 是 ANSI C 的一种形式... 但通常理解的是 ANSI C 是 ANSI X3.159-1989,它先于 ISO C。 - Andrew
2个回答

92

//注释在旧版(pre 99)的C语言中不允许使用,应该使用/**/(或者移除-ansi,它是C89标准的同义词)。


1
到目前为止,这是最好的答案,也很可能是最佳的可行答案。 - JUST MY correct OPINION
3
在不加-ansi选项的情况下,gcc支持带有GNU特定扩展的C89语法,其中一个扩展恰好是双斜杠 // 注释。加上-std=c99选项后,gcc会尝试遵循1999年ISO C标准,该标准要求支持双斜杠 // 注释。 - Keith Thompson

25

请参阅GNU编译器文档中的C++注释

在GNU C中,您可以使用C ++风格的注释,以//开头,直到行尾。许多其他C实现允许这样的注释,并且它们包含在1999 C标准中。但是,如果您指定了一个指定C99之前的ISO C版本或-ansi(等同于-std=c89)的-std选项,则不会识别C ++风格的注释。

(强调是我的,因为一些帖子声称//不允许在标准C中,而这仅适用于99年之前的标准)。


6
对于我们中的一些人,“标准C”早在1999年之前就已经标准化了。明确指定标准的具体修订版本总是明智的! :-) - Brian Knoblauch
3
@Brian:所以...我们需要一个标准...标准。 - user47589
2
大多数不必担心跨平台问题的用户可能会更喜欢使用“-std = gnu99”。 - nolandda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接