Объявление класса C ++ в заголовке Objective-C

Я хочу объявить стиль класса C ++ в заголовке objective-c, но получаю сообщение об ошибке "error: expected '=', ',', ';', 'asm' или '__ attribute __' перед 'CPPClass'"

Вот код из файла .h.

class CPPClass;  
@interface OBJCClass : NSObject  
{  
    CPPClass* m_pCPPObject;  
}  
@end

если я реализую его в стиле objective-c @class CPPClass, я получаю сообщение об ошибке при его определении, говоря, что он не может найти объявление интерфейса. Есть ли способ сделать это, иначе все классы objective-c, которые импортируют мой файл заголовка с импортированным заголовком C ++, также должны быть файлами .mm.

пс. Я переименовал файл m в mm.


person MartinG    schedule 30.07.2010    source источник
comment
Какие файлы у вас есть? CPPClass.cpp, CPPClass.h, OBJCClass.mm и OBJCClass.h? Какой именно компилируемый файл был указан непосредственно перед ошибкой компиляции. Я предполагаю, что файл .cpp на самом деле жалуется, когда он # включает файл с определениями obj-c.   -  person Chris Becke    schedule 30.07.2010
comment
классы, как вы сказали, файл cpp никогда не включает OBJCClass.h. Я думаю, проблема в том, что другие классы obj-c включают OBJCClass.h и не могут интерпретировать объявление стиля c.   -  person MartinG    schedule 30.07.2010


Ответы (2)


Объявите класс cpp только при компиляции C ++. В противном случае используйте typedef, чтобы аннулировать:

#ifdef __cplusplus
class CPPClass;
#else
typedef void CPPClass;
#endif

Таким образом, единицы компиляции, отличные от C ++, видят переменную экземпляра как указатель void. Поскольку все указатели имеют одинаковый размер, тип переменной экземпляра не имеет значения.

person Nikolai Ruhe    schedule 30.07.2010

Переименуйте все файлы, которые включают его, как имеющие расширение .mm. Это скажет компилятору скомпилировать с флагом -ObjC++.

person jer    schedule 30.07.2010
comment
Я боялся этого, это больше, чем пара файлов, которые включают этот файл, и надеялся, что есть какой-то способ обойти это :( - person MartinG; 30.07.2010