在目标 C 中向前声明命名空间的C++类

Forward declaration of a namespaced C++ class in in Objective C

本文关键字:命名空间 C++ 声明 目标      更新时间:2023-10-16

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

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

namespace name
{
    class Clazz
    {
    };
}

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

有什么想法吗?
谢谢大家!

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

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

出于显而易见的原因,您不能在 C 或 ObjC 翻译中使用 name::Clazz,因此这非常有效。您要么需要在C++翻译中使用前向声明,要么不需要对 C 或 ObjC 可见。

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

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

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

namespace MyNamespace { class MyClass; };

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

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

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

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