导致 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++
(注意-x
和c++
之间没有空格)。
$ 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++ <filename>
而不仅仅是使用 printf 命令
确实它不像cpp -xc++ <filename>
一样工作,除非<filename>
具有C++ 扩展。这是Apple的另一个错误。我没有想法,我只能建议使用cpp -xc++ < <filename>
作为解决方法。或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代替
Mac OS X 上的 GLSL 版本 130 导致错误 [关闭]