Это может плохо произойти, потому что экземпляр SomeClass будет иметь другой размер и компоновку в зависимости от того, скомпилирован ли он из файла .m или .mm.
Вот что я хотел бы сделать (с добавленным кодом, чтобы сделать его включаемым также из .c и .cp):
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#endif
#ifdef __cplusplus
#include "CPlusPlusLibrary.h"
#endif
#ifdef __cplusplus
class CPlusPlusClass;
#else
typedef struct CPlusPlusClass CPlusPlusClass;
#endif
#ifdef __OBJC__
@class AnotherObjCClass;
@interface SomeObjCClass : NSObject
{
CPlusPlusClass* _variableCPP;
AnotherObjCClass* _variableObjC;
}
#else
typedef struct ObjC_AnotherObjCClass AnotherObjCClass;
typedef struct ObjC_SomeClass SomeObjCClass;
#endif
#ifdef __cplusplus
extern "C" { // Callable from C
#endif
void CFunctionTakingCPlusPlusClass(CPlusPlusClass* foo);
void CFunctionTakingSomeObjCClass(SomeObjCClass* foo);
#ifdef __cplusplus
}
#endif
Обратите внимание, что при компиляции файла .mm определяются и __OBJC__, и __cplusplus. #include и #import примерно эквивалентны в Objective-C (расширенный набор C-99), но вы должны использовать #include для всего, что видно в C / C ++.
Помните, что в C struct foo*
с foo, который никогда не определен (указатель на анонимную структуру), является совершенно допустимым типом, так что это делает typedef "другие языковые классы" как анонимные структуры, которые вы можете передавать по указателю w / o глядя на содержимое.
Я оставлю в качестве упражнения, как это взаимодействует с ARC для переменных экземпляра ObjC. (Там могут быть драконы и / или вам может понадобиться __unsafe_unretained)
IIRC, если вы используете то же имя для структуры, что и класс C ++, отладчик покажет правильную информацию, если она у него есть. Я не уверен, что это безопасно для Obj-C, поэтому я использовал другое имя.
Кроме того, старайтесь избегать включения заголовка C ++ (просто #include его в вашем файле реализации .mm), если он не нужен для типов, отличных от анонимного класса. В качестве альтернативы вы можете создать для него заголовок-обертку, который выглядит как верхняя часть этого файла.
HTH, -Steve