2

是否可以在 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

4 回答 4

5

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

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

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

于 2012-04-11T04:58:35.023 回答
2

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

#ifdef __cplusplus
namespace name{
#endif
    struct classname;
#ifdef __cplusplus
}
using namespace name;
#endif
于 2012-04-11T04:51:21.757 回答
1

你可以像这样在命名空间中声明一个转发类:

namespace MyNamespace { class MyClass; };

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

于 2012-04-11T02:00:00.930 回答
0

至少在普通 C++ 中,您会执行以下操作:

namespace a {
    class b;
}

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

我不能说Objective C编译器是否会接受这一点。

于 2012-04-11T02:00:00.713 回答