如何在启用 ANSI 的情况下,在 gcc 中启用 C++ 样式的注释?

19

这是我在工作中遇到的一个问题,经过一番搜索,我找到了ExpertsExchange上的答案。现在我将原问题提问者Manchung的话转给你:

我有一个使用纯C编写的项目,并将用于嵌入式系统。因此,我使用纯C来最小化代码大小。

当我编译项目时,我使用-ansi标志以确保代码符合ANSI标准。然而,使用这个ansi标志的缺点是我只能使用C风格的注释(/*comments */)。当我需要使用嵌套注释时,这让我很头疼。

所以,我的问题是:在保持启用ANSI检查的同时,我可以使用哪些开关/标志来允许我使用C++风格的注释(// comments)?

这基本上总结了我的问题。


这个问题的最高票答案已经不再有效。我很想看到一个解决方案 - 在我的情况下,这是因为我正在尝试强制实现Windows和Linux之间的跨平台代码兼容性。Windows需要大多数符合ANSI标准的代码,但在系统头文件中有c++风格的注释。如果我不将它们标记为警告(并将其作为错误),我的Windows开发人员使用c++风格的注释。启用GCC中的c++注释似乎是最简单的答案。 - mbauman
7个回答

30
在最近版本的gcc中,-ansi被记录为与-std=c89相同。新的注释语法只能使用C99标准,因此-std=c99可以允许其使用。
还有-std=gnu89,它与-std=c89相同,但允许所有的gcc扩展(包括C++样式的注释语法,在其被添加到标准之前是GNU的扩展)。
还要看一下-pedantic标志,它可能会给你一些有用的警告。
参考资料:

4
"-std=gnu89" 可能是原帖作者最好的选择,"-std=c99"会产生其他可能不太理想的后果。 - zwol
3
-std=gnu89 对我很有用,我还在寻找具有大部分 ANSI 语义的增强注释。 - davenpcj
文档指出,-ansi选项等同于-std=c90,而不是c89(即使这两个似乎又成为了同义词,为了“正确”起见)。 - mozzbozz

19

如果你想使用C++风格的注释仅仅是因为你想注释掉某些块,并且对嵌套的/* ... */感到头疼,你可以采用这种技巧:

如果你想要注释掉一段代码,你可以将它们放在一个函数或条件语句中,然后用C++风格的注释把整个函数或语句注释掉,这样就不用担心注释符号的嵌套问题了。

例如:

{   // { starts the function or statement
    // code you want to comment out goes here
}   // } ends the function or statement, and the C++-style comment applies to everything in between
#if 0
... code ...
#endif

这实际上也会完成工作。


7
我的回答有什么问题吗?如果你给我点“踩”,请评论说明原因。在C++89中,无法嵌套使用C风格的注释,而C++风格的注释是无效的。如果你想注释掉代码,那么这个#if 0几乎是唯一干净可靠的方法。 - Johannes Schaub - litb
这是我认为解决这个问题的最佳方法。 - Spidey
5
这并不回答问题,只是避免了它。 - Thomas
@thomas 但我怀疑问题的真正问题是注释掉代码。因此,我回答了。我的答案避免了问题,因为它试图从根本上解决假定的问题,这是更优越的。 - Johannes Schaub - litb
5
@JohannesSchaub-litb 在这样做时,您的回答并没有回答每个人点击此链接想要解决的问题,并且更不通用。所以,不,它并不是更好的解决方法。它有助于原始提问者,但对于后来点击链接的大多数人没有帮助。这就是StackOverflow的意义所在。 - Thomas

15

您可以使用 -lang-c-c++-comments 预处理器同时拥有 ANSI 模式和 C++ 样式的注释。

gcc -Wp,-lang-c-c++-comments -c source.c

这是因为它实际上是一个预处理器标志,所以你可以像这样调用它:gcc -Wp,-lang-c-c++-comments -- 而不是直接在命令行上。然而,如果你真的想要ansi可移植性,那么你就不应该有c++风格的注释... :) - Jason Coco
2
我认为你的回答是最权威的。 - Johannes Schaub - litb
9
我认为这已经不再被支持了。我无法在Mac或Linux上的GCC 4.2或4.4中让它工作。我只能在GCC的CPP手册中找到这个参考(回溯到2.9版):“注意:之前版本的CPP接受了一个“-lang”选项,该选项选择了语言和标准一致性级别。此选项已被删除,因为它与“-l”选项冲突。” 我找不到替代品。 - mbauman

3
如果你只是使用-ansi来检查兼容性,那么最简单的方法可能是准备一个脚本或makefile目标,将完整的源代码树复制到一个名为"ansi"的文件夹中,并修补掉//注释。伪bash代码如下:
SRC=main.c blip.c blip.h
cp makefile ansi-src/
for F in $SRC do
# does not handle // in string literals or /**/ comments!
sed 's/\/\/.*//g' < $F >ansi-src/$F
done
cd ansi-src
make CFLAGS=-ansi

如果你的SCC支持,这也可以成为一个提交钩子(commit-hook),每次提交后在专用机器上以ANSI模式自动构建代码,并将报告通过邮件发送给你。

在修补源代码时要注意尾随反斜杠。 - Ruslan

0

恐怕编写某种评论重写实用程序(如Luther Blissett所建议的)可能是您在这里的唯一选择。在现代版本的gcc中,似乎没有任何编译器标志或CLI选项可以在使用-ansi-std=c89时启用C++样式的注释。

您可能可以从不同的角度来解决问题。您可以使用-std=c99进行编译,并使用编译器标志禁用您不需要的C99特定扩展(如果不知道为什么需要符合ANSI标准,我无法推荐具体的标志)。


-3
你可以自动构建一个去除注释的源代码副本,并在程序中使用它。
例如,this 看起来很有前途。

-7

C语言已经使用C++风格的注释近十年了,或许你应该升级一下?


我认为我们在64位嵌入式系统中使用由Wind River提供的gcc 3.x。 - graham.reeds
2
这就是他想做的事情 - 从C89升级到带有C++风格注释的C89。考虑到他说目标是嵌入式系统,它很可能没有符合C99标准的编译器。即使是GCC也没有实现C99。 - Steve Jessop
1
实际上,它是gcc 2.9! - graham.reeds
1
如果代码只需要在gcc 2.9+版本上编译,那么使用-ansi标志就没有太大意义了。这会阻止您使用其他C89实现可能缺少的内容,但如果不需要这个要求,那么考虑使用默认模式-std = g89,它允许//。 - Steve Jessop

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