Как проверить, компилируется ли 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 ответ:
Проблема заключалась в том, что по умолчанию XCode определяет тип файла по расширению, а не по проекту, поэтому он думал, что .cpp-файл был обычным c++ - файлом, хотя он и является частью проекта Objective C++, поэтому он не определял макрос
__OBJC__
в этом файле. Решение состояло в том, чтобы изменить режим компиляции, щелкнув правой кнопкой мыши .cpp файл в списке файлов в левой части XCode, нажмите на кнопку "Показать инспектор файлов" и в выпадающем списке " Тип " В правой части XCode выберите "Objective-C++ Source "вместо" Default-C++ Source":Это заставит XCode думать, что.cpp-файл является объективным файлом C++, поэтому он будет определять макрос
__OBJC__
.Поскольку это параметр для каждого проекта, он влияет только на проект Objective C++ и ничего не меняет в простом проекте C++, поэтому
#ifdef __OBJC__
будет способом проверить, в каком проекте компилируется файл.
благодаря Джош Касуэлл для дачи мне идея в этом Комментарии .