简体   繁体   中英

Using an Objective-C++ file from a C++ file

I have a c++ app that I'm trying to port to iPhone and to start off I'm trying to replace my c++ texture loader with an obj-c++ texture loader so that I can make use of the cocoa libraries.

A lot of my c++ files (.cpp files) call the texture loader with something like:

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

but whenever I try to make a TextureLoader class (inside a .mm file) that has Obj-C code, I am forced to make the calling class also a .mm file.

I want to avoid a creep of .mm usage. How can I do it? Is it even possible?

Basically I have a .mm file that has...

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

and is apart of a c++ class (or is it obj-c++ at this point?)

I want to be able to use it from a .cpp file without having to make the calling class also .mm

Is there anyway to do this?

Cheers guys.

I want to avoid a creep of .mm usage. How can I do it? Is it even possible?

Not if you want to use Objective-C++, no.

The simplest thing to do is just to compile everything as Objective-C++. You don't have to change all of your extensions; leave 'em as .cpp and set Xcode to compile everything as Objective-C++: under the build settings of your project, in the category "GCC XX - Language", change "Compile Sources As" to "Objective-C++".

(I assume your problem is that you have a whole bunch of .cpp files, and you don't feel like renaming them all to .mm . Compiling as Objective-C++ will have no effect on the ones that don't actually use any Objective-C stuff (with only very rare exceptions), and it'll make your life easier for the ones that do.)

I'm not aware of any way to do that. However, you are not required to put all C++ member function definitions in a single file - just stick all the pure C++ stuff into .cpp , and those that need ObjC into .mm .

As well, if you actually have the same repeated ObjC code (perhaps parametrized), then refactor it into a plain C function or C++ class in one separate .mm - such that there are no ObjC constructs in the corresponding .h - and then use that function/class where needed by including the header.

Not sure on the size of the code involved, but if it had a pretty small interface, you could write a C wrapper for your C++ code, and then use extern C { /* ... */ } around the header file declarations and function definitions.

This would essentially "hide" the C++ calls from Objective-C, and would allow you to circumvent the requirement of renaming your files from the m to the mm extension, and/or the requirement of compiling the calling files as Objective-C++.

Objective-C++ uses different compiler rules and is slower than a standard Objective-C compile.

In XCode, right-click on your .cpp file and select “Get Infos”. In the “General” tab, change the file type to sourcecode.cpp.objcpp . This will build this file and only this file as Objective C++.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM