2009-08-15 3 views
1

У меня есть приложение C++, которое я пытаюсь подключить к iPhone, и для начала. Я пытаюсь заменить мой загрузчик текстур C++ загрузчиком текстур obj-C++, чтобы Я могу использовать библиотеки какао.Использование файла Objective-C++ из файла C++

Много моих C++ файлов (.cpp файлов) называют текстуры погрузчиком с чем-то вроде:

GLuint mTexture = TextureLoader::LoadTexture("file.png") //LoadTexture is a static method` 

, но всякий раз, когда я пытаюсь сделать класс TextureLoader (внутри файла .mm), который имеет obj- C, я вынужден сделать вызывающий класс также файлом .mm.

Я хочу избежать ползучести использования .mm. Как мне это сделать? Возможно ли это?

В принципе у меня есть файл, который имеет .mm ...

GLuint TextureLoader::LoadTexture(const char* path) 
{ 
    //...lots of c and obj-c code 
    return texture 
} 

и, кроме класса C++ (или это Obj-C++ в этот момент?)

Я хочу быть возможно использовать его из файла .cpp, не создавая также вызывающий класс .mm

Есть ли все-таки сделать это?

Cheers guys.

ответ

0

Я не знаю, как это сделать. Однако вам не нужно указывать все определения функций члена C++ в одном файле - просто вставьте все чистые вещи C++ в .cpp, а те, которые нуждаются в ObjC, - .mm.

Как хорошо, если вы на самом деле имеете один и тот же повторяющийся код ObjC (возможно параметризованный), а затем реорганизовать его в простую функцию C или класс C++ в один отдельный .mm - такой, что нет ObjC не строит в соответствующих .h - и затем используйте эту функцию/класс, если необходимо, включив заголовок.

+0

Спасибо, Павел, вы поняли это. Я думаю, проблема в том, что у меня, должно быть, был код Obj-c в заголовочном файле моего кода загрузки текстуры. Это означало, что, когда мой код на C++ включал файл .h, компилятору это не понравилось. Я попробую и суммирую: Скажем, у меня есть Foo.cpp и Foo.h (только C++), а Foo.cpp должен включать TextureLoader.h, который содержит определение класса C++, в методах членов которого используется код obj-c (в TextureLoader.mm). Убедитесь, что в TextureLoader.h нет кода obj-c или какао, иначе Foo.cpp не сможет # включить его. – user156848

+0

Очевидный ответ: не определяйте свои функции-члены, которые используют конструкции ObjC в файле заголовка; определите их в .mm файле. –

4

Я хочу избежать ползучести использования .mm. Как мне это сделать? Возможно ли это?

Нет, если вы хотите использовать Objective-C++, no.

1

Простейшая задача - просто скомпилировать все как Objective-C++. Вам не нужно изменять все ваши расширения; оставить его как .cpp и установить Xcode для компиляции всего, как Objective-C++: в соответствии с настройками сборки вашего проекта, в категории «GCC X.X - Language», измените «Компилировать источники как» на «Objective-C++».

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

0

В XCode, щелкните правой кнопкой мыши на файле .cpp и выберите «Get Infos ». На вкладке «Общие» измените тип файла на sourcecode.cpp.objcpp. Это создаст этот файл и только этот файл как Objective C++.

0

Не уверен относительно размера используемого кода, но если у него был довольно небольшой интерфейс, вы могли бы написать C-оболочку для вашего кода на C++, а затем использовать extern C { /* ... */ } вокруг деклараций и описаний функций заголовка.

Это будет по существу «скрыть» С ++ требует от Objective-C, и позволит вам обойти требование переименования файлов с m к mm расширения в и/или требование составления вызывные файлов в Objective -C++.

Objective-C++ использует разные правила компилятора и медленнее, чем стандартный компилятор Objective-C.

Смежные вопросы