16

I have a .cpp/.hpp file combo -> the .hpp file has #include ..

I also have a .mm/.h file combo -> if I include the .hpp file within my .mm Objective C++ file, there are no issues. However, if I try to include the .hpp file within my .h (Objective C header) file, I get a preprocessor issue 'iostream not found'.

Is there any way around this other than doing funky stuff like having a void* in my Objective C .h file and then casting it as the type that is included in the .mm or wrapping every C++ type within an Objective C++ type?

My question is basically the same as Tony's question (but nobody answered his):

https://stackoverflow.com/questions/10163322/how-to-include-c-header-file-in-objective-c-header-file

6
  • 1
    You have to avoid any C++ includes/code in your header for your file to be included in other non Objective-C++ classes. This means you may need to use void* to store member variables. Commented Dec 3, 2012 at 20:59
  • You are asking is there a valid way for compiler of language A to compile language B. Usually no. Objective-C can use C code. Objective-C++ code can use C++ code. But C and C++ are different languages so keep them apart very strictly. Commented Dec 3, 2012 at 21:09
  • @LokiAstari - Actually, that isn't what I was asking -> I'm using only Objective C++ and C++. My C++ includes iostream (e.g. C++) and my Objective C++ header file can't include my C++ header file since that header file include iostream. Commented Dec 3, 2012 at 21:43
  • @Joe - thanks for your answer; if you put it as an answer, I'll mark it as accepted. However, I definitely wish there was a better way that using void* and casting everywhere... :/ Commented Dec 3, 2012 at 21:44
  • 2
    @fatfreddyscat I've got something better.. an answer using opaque pointers. Commented Dec 3, 2012 at 21:48

3 Answers 3

27

The problem is that you have to avoid all C++ semantics in the header to allow normal Objective-C classes to include it. This can be accomplished using opaque pointers.

CPPClass.h

class CPPClass
{
public:
    int getNumber()
    {
        return 10;
    }
};

ObjCPP.h

//Forward declare struct
struct CPPMembers;

@interface ObjCPP : NSObject
{
    //opaque pointer to store cpp members
    struct CPPMembers *_cppMembers;
}

@end

ObjCPP.mm

#import "ObjCPP.h"
#import "CPPClass.h"

struct CPPMembers {
    CPPClass member1;
};

@implementation ObjCPP

- (id)init
{
    self = [super init];
    if (self) {
        //Allocate storage for members
        _cppMembers = new CPPMembers;

        //usage
        NSLog(@"%d", _cppMembers->member1.getNumber());
    }

    return self;
}

- (void)dealloc
{
    //Free members even if ARC.
    delete _cppMembers;

    //If not ARC uncomment the following line
    //[super dealloc];
}

@end
Sign up to request clarification or add additional context in comments.

2 Comments

This is a great response! Helped me out just now!
I have the problem of objective-c++ header creep. If I have an objective-c++ wrapper class, its header includes C++ headers. And then I wish to use this wrapper object in other objective-c code, I import the wrapper class header which inturn includes the c++. Therefore requiring all my classes to become objective-c++. How do you stop this?
4

To use C++ in an Objective-C++ header file make sure to:

  1. Have a .h/.mm couple (Objective-C++)
  2. In the identity of your file, have the type set to Objective-C++ Source (it should be automatic)
  3. Include the considered file only from Objective-C++ source files. This point is obvious but can be very quickly forgotten and hard to track down

Comments

0

The #include directive simply includes text; the only time Objective C will complain is if there is something in the include file that is not valid Objective C.

In your case, it gives you the answer; the iostream.h header file is not found in Objective C. Find where this file is referenced and remove the #include to it.

5 Comments

unfortunately, I can't remove the #include in the .hpp file as it uses certain types in iostream..
Well, here's a thread on this that seems to indicate a work-around: stackoverflow.com/questions/3794931/…
-> thanks for the response but unfortunately that doesn't work for me as I am including my .hpp within the Objective C++ .h file; I tried renaming the .h to .mm and importing that instead but that didn't work. I also tried moving the stuff from the Objective C++ .h file into the .mm file but that didn't work either (and of course wouldn't be helpful in the long run).
You could do what the c people have been doing for years and #ifdef (__cplusplus)
Joe's answer (comment on original question) works best for me: stackoverflow.com/a/2262395/418715

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.