Компиляция кода C внутри кода C++ внутри кода Objective-C++

Моя проблема немного сложна:

Библиотека: у меня есть библиотека, написанная на C и C++. Он идеально компилируется в XCode с Apple LLVM. Работа самой библиотеки выполняется кодом C, в то время как часть C++ - это просто интерфейс C++, потому что я предпочитаю C++. В теории мне нужно использовать только C++ для общения с ним.

Приложение: у меня есть приложение в Objective-C, которое использует библиотеку выше. Конечно, поскольку связь с моей библиотекой осуществляется через C++, мне нужен файл.mm для вызова моей библиотеки из "Objective-C++".

Во время компиляции... происходит несколько языков "C":

  • ошибка: неконстантный статический член данных должен быть инициализирован вне строки
  • ошибка: выражение оператора не допускается в области видимости файла
  • так далее...

Это происходит только с Objective-C++

  • Objective-C++ (приложение) -> заголовки C++ (lib) -> заголовки C (lib, с внешним "C") -> НЕ ОК!!! ЗАЧЕМ?

Если я сделаю еще одно приложение C++ для тестирования библиотеки, все пойдет нормально

  • C++ (приложение) -> C++ (lib) -> заголовок C (lib, с внешним "C") -> ОК

Подробно: я всегда использую компилятор Apple LLVM здесь

Вопрос: как мне скомпилировать код C из C++ из кода Objective-C++? Почему это отличается от компиляции из обычного кода C++?

2 ответа

Решение

После долгого периода попыток и Google я наконец смог разобраться. Прежде чем я вызову свои заголовки C, я должен определить макросы MAX и MIN. По какой-то причине они были определены ранее. Компилятор не показывает ошибку с точностью. Вот почему это было сложно. Я использую платформу C, которая имеет собственное объявление макросов MAX и MIN...

Еще одна очень интересная вещь, которая может быть полезна для других, состоит в том, что прежде чем нам нужно сделать то же самое: отменить определение max и min (нижний регистр), если мы используем какую-то C-среду, которая реализует свои собственные max и min.

Это решило обе проблемы.

Не забывай делать

#ifdef __cplusplus
extern "C" {
#endif

<Some C method declaration>

#ifdef __cplusplus
}
#endif

в ваших заголовочных файлах, которые содержат объявления метода C.

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