Domanda Come includere intestazioni C ++ in un'intestazione Objective C ++?


Ho un file .cpp / .hpp combo -> il file .hpp ha #include ..

Ho anche un file .mm / .h -> se includo il file .hpp nel mio file .mm Objective C ++, non ci sono problemi. Tuttavia, se provo ad includere il file .hpp all'interno del mio file .h (Objective C header), ottengo un problema del preprocessore 'iostream not found'.

Esiste un modo per aggirare questo diverso dal fare cose funky come avere un vuoto * nel mio file Objective C .h e quindi lanciarlo come il tipo che è incluso nel file .mm o che avvolge ogni tipo di C ++ all'interno di un tipo Objective C ++?

La mia domanda è fondamentalmente la stessa della domanda di Tony (ma nessuno ha risposto alla sua):

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


10
2017-12-03 20:56


origine


risposte:


Il problema è che devi evitare tutta la semantica C ++ nell'intestazione per consentire alle normali classi Objective-C di includerla. Questo può essere realizzato usando puntatori opachi.

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

17
2017-12-04 13:54



Per utilizzare C ++ in un file di intestazione Objective-C ++, assicurati di:

  1. Avere una coppia .h / .mm (Objective-C ++)
  2. Nell'identità del tuo file, avere il tipo impostato su Objective-C ++ Source (dovrebbe essere automatico)
  3. Includere il file considerato solo dai file di origine Objective-C ++. Questo punto è ovvio ma può essere dimenticato molto rapidamente e difficile da rintracciare

3
2017-07-04 08:05



La direttiva # include un testo; l'unica volta che l'Objective C si lamenterà è se c'è qualcosa nel file include che non è valido. Obiettivo C.

Nel tuo caso, ti dà la risposta; il file di intestazione iostream.h non si trova nell'obiettivo C. Trova dove si fa riferimento a questo file e rimuovi # include.


0
2017-12-03 20:57