Смешивание кода 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. Извини:(

Другие вопросы по тегам