Как проверить, компилируется ли cpp-файл в проекте Objective C++ с помощью препроцессора?


У меня есть исходный файл C++ (.cpp), который разделяется между двумя моими проектами, один из которых использует Objective C++, а другой просто использует обычный C++. У меня есть часть этого файла, где мне нужно использовать другой код для проекта Objective C++ и для простого проекта C++, поэтому мне нужно проверить, компилируется ли проект с помощью Objective C++ или нет. После некоторого поиска я обнаружил, что макрос __OBJC__ можно использовать для проверки, компилируется ли файл компилятором Objective C, поэтому я попробовал это код:

#ifdef __OBJC__
    //Objective C++ specific code here
#else
    //Plain C++ specific code here
#endif
Проблема в том, что макрос __OBJC__ никогда не определяется, даже в проекте Objective C++. Я также заметил, что макрос __OBJC__ определен в файлах. mm в проекте Objective C++, но не в самом проекте .cpp-файл.

Если это имеет значение, я компилирую Objective C++ project для iOS с помощью XCode, а plain C++ project-это кроссплатформенная компьютерная программа, которая может быть скомпилирована с помощью Visual Studio, XCode или GCC.

Как я могу проверить с помощью препроцессора если мой .cpp-файл компилируется в проекте Objective C++ или в простом проекте C++?

1 2

1 ответ:

Проблема заключалась в том, что по умолчанию XCode определяет тип файла по расширению, а не по проекту, поэтому он думал, что .cpp-файл был обычным c++ - файлом, хотя он и является частью проекта Objective C++, поэтому он не определял макрос __OBJC__ в этом файле. Решение состояло в том, чтобы изменить режим компиляции, щелкнув правой кнопкой мыши .cpp файл в списке файлов в левой части XCode, нажмите на кнопку "Показать инспектор файлов" и в выпадающем списке " Тип " В правой части XCode выберите "Objective-C++ Source "вместо" Default-C++ Source":

Введите описание изображения здесь

Это заставит XCode думать, что.cpp-файл является объективным файлом C++, поэтому он будет определять макрос __OBJC__.

Поскольку это параметр для каждого проекта, он влияет только на проект Objective C++ и ничего не меняет в простом проекте C++, поэтому #ifdef __OBJC__ будет способом проверить, в каком проекте компилируется файл.


благодаря Джош Касуэлл для дачи мне идея в этом Комментарии .