导致 cpp(C 预处理器)删除 Mac OS X 上的 C++ 注释

Posted

技术标签:

【中文标题】导致 cpp(C 预处理器)删除 Mac OS X 上的 C++ 注释【英文标题】:Causing cpp (C preprocessor) to remove C++ comments on Mac OS X 【发布时间】:2010-11-09 19:57:52 【问题描述】:

我有一个用户报告(很遗憾,由于缺少合适的机器而无法验证)Mac OS X 10.6.4 上的 C 预处理器 (cpp) 命令不会删除 C++/C99 双斜杠 @987654323 @ cmets 来自它处理的文件,无论它给出什么选项。这是 gcc 版本:

 i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)

是否有可能以某种方式使其删除此类 cmets,正如人们对 C++ 预处理器所期望的那样(这是必需的,因为 cpp 被用作 another tool 的一部分)。

【问题讨论】:

wilx 的方法应该奏效了;请让您的用户准确地描述他们做了什么,他们期望发生什么,以及实际发生了什么。 @Zack:你试过并看到它有效吗? @Zack:我刚试过。我也不能让 cpp 丢弃 // 样式的 cmets。 @JeremyP:谢谢!终于有了支持的回应 我承认我很惊讶我的 cpp 基于 gcc 4.2.1,这也是 mty 当前安装的 C 编译器。 gcc -E 工作正常,但 cpp 无法使用任何 -x 选项或 -std=c99 【参考方案1】:

我找到了一个适用于cpp 命令的公式:试试cpp -xc++(注意-xc++ 之间没有空格)。

$ printf '/* block comment */\n// line comment\nnot a comment\n' | cpp -xc++
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"


not a comment

对比:

$ printf '/* block comment */\n// line comment\nnot a comment\n' | cpp -x c++
i686-apple-darwin10-gcc-4.2.1: c: No such file or directory
i686-apple-darwin10-gcc-4.2.1: c++: No such file or directory
i686-apple-darwin10-gcc-4.2.1: warning: '-x -x' after last input file has no effect
i686-apple-darwin10-gcc-4.2.1: no input files

现在 '-x c++' 应该可以工作,并且可以在我的 Linux 机器上工作(使用 gcc 4.4,但我记得它早在 gcc 2.95 之前就可以工作),所以苹果似乎打破了它。

我真的必须再次强调为此类问题提供完整、精确的测试用例的重要性。昨天我没有想到要寻找 Apple 引入了一个错误,因为我知道 wilx 的答案应该有效,并且在没有准确描述 OP 用户尝试的内容的情况下,它是他们更有可能在他们的实际命令行上有其他东西否定它。如果我在上面显示的命令行和错误消息在原始问题中提供,那将更有效地吸引所有人的注意力。

【讨论】:

感谢您的努力。我会要求用户尝试并报告发生的情况(以这种方式手头没有机器很烦人:-/) 您能否确认这适用于通过cpp 运行的完整文件(如cpp -xc++ &lt;filename&gt; 而不仅仅是使用 printf 命令 确实它cpp -xc++ &lt;filename&gt; 一样工作,除非&lt;filename&gt; 具有C++ 扩展。这是Apple的另一个错误。我没有想法,我只能建议使用cpp -xc++ &lt; &lt;filename&gt; 作为解决方法。或gcc -E.【参考方案2】:

尝试将-x c++-x c -std=c99 添加到命令行。

【讨论】:

这是我向用户建议的第一件事,他尝试...没有帮助。它对你有用吗?【参考方案3】:

似乎可行的部分解决方案是调用gcc -E 而不是cpp

 -E                       Preprocess only; do not compile, assemble or link

这确实剥离了 Mac OS X 上的 // cmets。

但是,我仍然很好奇为什么cpp 本身存在问题。

【讨论】:

以上是关于导致 cpp(C 预处理器)删除 Mac OS X 上的 C++ 注释的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 这在Windows,Linux,* BSD和Mac OS X上提供了endian.h的endian转换函数。你仍然需要使用-std = gnu99代替

clang++ mac os x c++11 链接器问题

Mac OS X 上的 GLSL 版本 130 导致错误 [关闭]

如何在 Mac OS X 中删除文件的“扩展属性”?

mac os 下 configure: error: C++ preprocessor "/lib/cpp“ 怎么解决

在 Mac OS X 上安装 C++ Armadillo 库