2

如果我在 foo.c 中有以下代码

#define P(x) printf("%s\n", #x)

void main() {
  P(3 == 4);
}

调用 gcc -E foo.c 将输出:

int main() {
  printf("%s\n", "3 == 4");
}

请注意,# 运算符已将宏参数 x 的文字字符串化。但是,当我调用 /usr/bin/cpp 时,我得到以下...未正确扩展。

int main() {
  printf("%s\n", #3 == 4);
}
4

2 回答 2

11

cpp命令的行为可能不是符合标准的 C 预处理器,而是传统的 pre-ANSI C 预处理器。我的猜测是,Apple 之所以这样做,是因为 Darwin 是一个 BSD 系统,如果您使用符合 C 语言cppC预处理器代替它。

无论如何,cpp不​​应使用该命令,因为您永远不知道会得到什么。c99 -E是调用 C 预处理器的符合 POSIX 的方法,并且$CC -E可能是在 Makefile 中执行此操作的正确方法。

于 2012-03-01T00:55:07.280 回答
5

看起来由于某种原因,cppon Lion(我和你的版本相同)的行为就像-traditional启用了开关一样。我可以重现您在其他二进制文件(Linux、FreeBSD)上观察到的输出cpp,但仅限于使用-traditional开关时。

对此进行调查后,事实证明/usr/bin/cpp在 Mac OS X 上是这样开始的脚本:

#!/bin/sh
#
# Transitional front end to CCCP to make it behave like (Reiser) CCP:
#       specifies -traditional
#       doesn't search gcc-include

-traditional一旦这个脚本指定了另一个选项,显然没有办法撤消它。一种解决方法是使用特定的安装版本,例如cpp-4.2. 在我的系统上使用cpp-4.2会产生所需的扩展。

于 2012-03-01T05:28:01.050 回答