【问题标题】:Forward declaration of a namespaced C++ class in in Objective CObjective C 中命名空间 C++ 类的前向声明
【发布时间】:2012-04-11 01:52:11
【问题描述】:

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

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

【问题讨论】:

  • 前向声明的 C++ 类有什么用?在这种情况下只需使用#typedef void Clazz

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


【解决方案1】:

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

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

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

【讨论】:

  • 我不知道 __cplusplus 的定义。现在一切都清楚了。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 您的回答也很有用。谢谢!
【解决方案3】:

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

namespace MyNamespace { class MyClass; };

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

【讨论】:

  • 您的回答也很有用。谢谢!
【解决方案4】:

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

namespace a {
    class b;
}

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

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

【讨论】:

  • objective-c 是 C 的纯超集,因此它无法识别 namespace 标识符
猜你喜欢
  • 2011-09-20
  • 2011-03-02
  • 2011-07-08
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多