在Objective C中转发声明的命名空间C ++类

时间:2012-04-11 01:52:11

标签: c++ objective-c class namespaces forward-declaration

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

要在Objective C中转发声明的C ++类:

namespace name
{
    class Clazz
    {

    };
}

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

有什么想法?
谢谢你们!

4 个答案:

答案 0 :(得分:3)

您只需像往常一样声明它,并在C ++ {/ 1}}检查时将其包装在C和/或ObjC翻译中也包含标题:

#ifdef

由于显而易见的原因,您无法在C或ObjC翻译中使用#ifdef __cplusplus namespace name { class Clazz; } // << name #endif ,因此这非常有效。你需要在C ++翻译中使用前向声明,或者它不需要对C或ObjC可见。

答案 1 :(得分:1)

您可以在命名空间中声明一个前向类,如下所示:

namespace MyNamespace { class MyClass; };

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

答案 2 :(得分:1)

您可以在Objective-c ++标头中将您的类声明为结构,然后将它们包含在C或obj-c代码中。通常适用的相同限制也适用于此案例。唯一需要注意的是,必须在命名空间周围放置ifdef,这样在C代码中包含标头时它们就不会出现,因为C编译器不知道命名空间。

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

答案 3 :(得分:0)

至少在正常的C ++中,你会做类似的事情:

namespace a {
    class b;
}

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

我不能说Objective C编译器是否会接受它。