В OSX, почему / usr / bin / cpp не поддерживает строковое преобразование аргументов макроса, в то время как gcc -E и clang -E поддерживают? - PullRequest
2 голосов
/ 01 марта 2012

Если у меня есть следующий код в 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);
}

Ответы [ 2 ]

11 голосов
/ 01 марта 2012

Команда cpp, вероятно, работает не как совместимый препроцессор C, а как унаследованный препроцессор до ANSI C.Я предполагаю, что Apple сделала так, потому что Darwin - это система BSD, и некоторые устаревшие программы BSD, использующие команду cpp для не-C целей (например, обработка макросов для конфигурационных файлов), могут сломатьсяхитрыми способами, если вы заменили на его место соответствующий препроцессор C.

В любом случае, команду cpp не следует использовать, поскольку вы никогда не знаете, что получите.c99 -E - это совместимый с POSIX способ вызова препроцессора C, а $CC -E, вероятно, является правильным способом сделать это в Makefile.

5 голосов
/ 01 марта 2012

По какой-то причине похоже, что cpp на Lion (у меня та же версия, что и у вас) ведет себя так, как будто включен переключатель -traditional.Я могу воспроизвести вывод, который вы наблюдали в других двоичных файлах cpp (Linux, FreeBSD), но только при использовании переключателя -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 в моей системе дает желаемое расширение.

...