Смешивание кода Objective-C и C++
У меня есть приложение Objective-C/C++, которое использует функциональные возможности, предоставляемые библиотекой C++.
Один из классов C++ включает перечисление вроде этого:
class TheClass
{
public:
[...]
enum TheEnum
{
YES,
NO,
};
[...]
};
Включение (используя #import -if, если это важно) файла заголовка с описанным выше объявлением класса в исходном файле Objective-C/C++ (*.mm) приведет к сбою компиляции, поскольку препроцессор заменит "YES" на термин "(BOOL) 1" (и аналогично"NO" by "(BOOL) 0").
Есть ли способ исправить это без переименования значений перечисления?
2 ответа
YES и NO - это предопределенные константы в Objective-C, объявленные в заголовке objc.h.
Вы должны помешать препроцессору расширять макросы "YES" и "NO". Это может быть сделано на местном уровне #undef
проверять их.
Но технически, если вы используете ключевое слово языка в качестве идентификатора, вы можете ожидать неприятностей. Вы не будете писать класс, содержащий член с именем MAX_PATH
, не могли бы вы?
#import
имеет значение - заголовки C++ в исходном файле Objective- C++ должны быть включены с#include
, Я думаю, хотя и не уверен на 100%, что выбор директивы include (#include
против#import
) определяет, какой препроцессор используется.
Вы также можете отменить объявление констант в перечислении, так как по умолчанию члены перечисления связаны с целыми числами, начиная с 0.
По комментариям я ошибаюсь. Похоже, вам придется переписать enum. Извини:(