user156848
user156848

Reputation: 65

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.

Upvotes: 1

Views: 1729

Answers (5)

markshiz
markshiz

Reputation: 2561

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.

Upvotes: 0

sam hocevar
sam hocevar

Reputation: 12129

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++.

Upvotes: 0

Jesse Beder
Jesse Beder

Reputation: 34054

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 X.X - 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.)

Upvotes: 1

Alex Reynolds
Alex Reynolds

Reputation: 96984

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.

Upvotes: 4

Pavel Minaev
Pavel Minaev

Reputation: 101665

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.

Upvotes: 0

Related Questions