Почему Xcode 4.2 применяет скрипт правил сборки файлов C для файлов .cpp?

У меня есть проект Xcode 4.2, который включает в себя цель, которая кросс-компиляции для окон. Я использую пользовательские правила сборки для исходных файлов C и C ++ в этой цели, вызывая i386-pc-mingw32-g ++ с помощью специального сценария. По какой-то причине Xcode запускает специальный сценарий, который я указал для исходных файлов C, даже при компиляции файлов с расширением .cpp. Почему это может быть? Как я могу получить Xcode 4.2 для запуска сценария «Исходные файлы C ++» для моих файлов .cpp?

У меня также есть файлы .c в этом проекте, и я надеюсь использовать флаг -std = c ++ 11 при компиляции файлов c ++, чтобы включить некоторые функции c ++ 11. Если я скомпилирую файлы .c с этим флагом, у меня возникнут странные проблемы с областями видимости констант, включенных в math.h, которые мне еще только предстоит попробовать и понять — я надеюсь, что смогу просто заставить Xcode запустить правильный скрипт для моего .cpp файлы.

Есть идеи?

Обновление: я смог заставить XCode запускать правильные сценарии. Чтобы сделать это, мне нужно было изменить пункты выпадающего меню «Процесс» с «Исходные файлы C» и «Исходные файлы C ++» на «Исходные файлы с совпадающими именами», а затем вручную ввести *.c а также *.cpp в предоставленном текстовом поле. Теперь я должен выяснить, почему я получаю M_PI was not declared in this scope сообщение об ошибке, где я не был раньше — может быть, используется другая версия math.h с флагом -std = c ++ 11, который либо не содержит константу M_PI, либо предоставляет ее в другом пространстве имен?

Обновление: Продолжая работать над этим — кажется, значение M_PI, которое я использовал из math.h, на самом деле является макросом, который имеет только # define’d if __STRICT_ANSI__ не был определен. Очевидно, переключение на c ++ 11 с использованием флага компилятора -std = c ++ 11 вызвало это __STRICT_ANSI__ макрос, который должен быть определен, и, следовательно, макрос M_PI, который я использовал ранее, отсутствует. Я полагаю, что лучше просто определить мои собственные константы числа Пи, чем возиться с объявлением этого __STRICT_ANSI__ макрос, но я, вероятно, немного углублюсь в это, чтобы уточнить, почему он объявляется сейчас, когда я использую флаг c ++ 11.

Обновление: я нашел этот пост Как я могу заставить C ++ 0x и __STRICT_ANSI__ ладить?, который просто предлагает определить «STRICT_ANSI‘macro сразу после флага’ -std = c ++ 11 ‘(или, скорее, эквивалентного флага’ -std = c ++ 0x ‘). Хотя это кажется отрывочным, никто не опубликовал сообщения о каких-либо проблемах из-за него, и он появляется в этом случае у меня тоже все работает. Документация Gcc по этому макросу находится здесь: http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html, со следующим соответствующим заявлением:

Макрос STRICT_ANSI предопределено при использовании опции -ansi. Некоторые заголовочные файлы могут заметить этот макрос и воздерживаться от объявления определенных функций или определения определенных макросов, для которых не требуется стандарт ISO; Это делается для того, чтобы не мешать любым программам, которые могут использовать эти имена для других целей.

До сих пор не ясно, почему флаг ‘-std = c ++ 11’ определяет это, когда он не установлен по умолчанию (очевидно, это будет -std = c ++ 98 ‘).

1

Решение

Если вы хотите поддержку C ++ 11 без режима ANSI, используйте -std=gnu++11 вместо std=c++11,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]