【问题标题】:Why can't I use //-style comments in my C code?为什么我不能在我的 C 代码中使用 // 样式的注释?
【发布时间】:2010-02-08 17:33:44
【问题描述】:

我正在使用gcc (Ubuntu 4.4.1-4ubuntu9) 来编译我正在编写的程序,但是每当它在我的代码中看到 // 注释时它似乎会呕吐,说:

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

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

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

为什么?

【问题讨论】:

  • 重要的是要认识到术语“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)引用它们会更清楚。
  • ANSI C可以指任何美国采用的ISO C...所以ANSI ISO/IEC 9899:2011是ANSI C的一种形式...但是通常的理解是 ANSI C 是 ANSI X3.159-1989,它先于 ISO C

标签: c


【解决方案1】:

// cmets 不允许在旧的(99 之前)C 版本中使用,请使用 /**/(或删除 -ansi,这是 C89 标准的同义词)

【讨论】:

  • 简短、准确、中肯。迄今为止最好的答案,并且可能是可以想象到的最好的答案。
  • 如果没有-ansi,gcc 目前支持带有 GNU 特定扩展的 C89;其中一个扩展恰好是// cmets。使用-std=c99,它试图符合1999 ISO C 标准,该标准需要支持// cmets。
【解决方案2】:

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

在 GNU C 中,您可以使用 C++ 样式的 cmets,它以 // 开头并一直持续到行尾。许多其他 C 实现允许这样的 cmets,并且它们包含在 1999 C 标准中。但是,如果您指定 -std 选项指定在 C99-ansi 之前的 ISO C 版本(等效于 -std=c89),则无法识别 C++ 样式 cmets。

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

【讨论】:

  • 对于我们中的一些人来说,“标准 C”早在 99 年之前就已经标准化了。准确地指定标准的哪个版本总是明智的! :-)
  • @Brian: 所以……我们需要的是一个标准……标准。
  • 大多数不必担心跨平台问题的用户可能会更喜欢-std=gnu99
猜你喜欢
  • 2015-06-14
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多