2012-04-11 41 views
2

是否可以在Objective C头文件中对名称空间内的C++类进行前向声明?目标C中名称空间C++类的前向声明Objective C

C++类转发声明在Objective C:

namespace name 
{ 
    class Clazz 
    { 

    }; 
} 

我知道我可以的,如果在C++类不在一个命名空间。取自http://www.zedkep.com/blog/index.php?/archives/247-Forward-declaring-C++-classes-in-Objective-C.html

有什么想法?
谢谢你们!

+0

前向声明的C++类有什么用?在这种情况下只需使用'#typedef void Clazz'。 – 2012-04-11 01:54:48

回答

3

你刚才宣布它像往常一样,和敷在C++ #ifdef检查时,也包括在C和/或ObjC翻译标题:

#ifdef __cplusplus 
namespace name { 
class Clazz; 
} // << name 
#endif 

出于显而易见的原因,你不能使用name::Clazz在C或ObjC翻译,所以这完美的工作。您可能需要C++翻译中的前向声明,或者它不需要对C或ObjC可见。

+1

我不知道__cplusplus的定义。现在已经很清楚了。谢谢。 – Butaca 2012-04-11 12:59:04

0

至少在普通的C++,你会做这样的事情:

namespace a { 
    class b; 
} 

int main(){ 
    a::b *c; 
} 

我不能说目标C编译器是否会接受与否虽然。

+0

objective-c是C的纯超集,因此它不会识别“名称空间”标识符 – mydogisbox 2012-04-11 04:53:26

1

你可以在一个命名空间声明正向类是这样的:

namespace MyNamespace { class MyClass; };

它应该在的OBJ-C++的工作,但如果没有,你也可以尝试OBJ-C的@class,或者只是做一个typedef void* Clazz

+0

您的回答也很有用。谢谢! – Butaca 2012-04-11 13:07:12

1

您可以在您的objective-C++头文件中将类声明为一个结构体,然后将它们包含在C或obj-c代码中。通常适用的相同限制也适用于这种情况。唯一需要注意的是,你必须在命名空间中放置ifdefs,以便在将C头文件包含在C代码中时不会出现,因为C编译器不知道名称空间。

#ifdef __cplusplus 
namespace name{ 
#endif 
    struct classname; 
#ifdef __cplusplus 
} 
using namespace name; 
#endif 
+0

你的回答也很有用。谢谢! – Butaca 2012-04-11 13:07:03