C ++和Cocoa:如何混合

时间:2012-06-30 03:02:54

标签: c++ xcode cocoa visual-c++

我需要制作以下伪代码:

在.h文件中:

class Foo
{
public:
    Foo();
    ~Foo();
    void MyFunc();
};

在.cpp / .m / .mm /中。文件:

Foo::Foo()
{
#if MAC
// Cocoa-specific initialization goes here
#endif
#if Windows
// Windows-specific initialization goes here
#endif
}

我正在使用XCode和MSVC并使用wxWidgets进行开发,因此我需要能够在MSVC和XCode项目中包含这些文件。

什么是最好的解决方案?我想要一个类 - 意思是2个文件(.h / .cpp)。

谢谢。

[编辑] 我发现了这个:How to create Cocoa objects in C++?并且来自geovar的评论显示它是可能的,但我在XCode中找不到该选项(Snow Leopard的版本为3.2 64位)。 有什么指针吗?

谢谢。 [/编辑]

1 个答案:

答案 0 :(得分:0)

预处理器测试__OBJC__可用于在可能也用于“纯”C ++文件的标头中有条件地声明Objective-C代码。例如:

#ifdef __OBJC__
  @interface Whatever : NSObject
  {
    . . .
  }
  . . .
  @end

#else

  class Whatever;

#endif

class SomeCPPClass
{
  . . .
};

// this actually works; the pointer form of the class
// can be passed freely from Objective-C++ to C++ through
// a plain-C or C++ routine such as this one
void SomeFunction (Whatever* param);

对于需要Objective-C ++的源文件,请将它们重命名为WhateverName.mm。也许这是必需的,也许不是,但它至少方便,因为您不必设置自定义构建规则。

请注意,即使重命名文件并使用Objective-C ++编译器,如果您希望它们仍然是99%C ++(有明显的例外;例如,没有任何内容可以命名为id)。一般来说,你想用C ++做的任何事都可以正常工作。

话虽如此,请阅读Objective-C与C ++的交互,因为有一些怪癖。例如,Objective-C异常在抛出时不会调用C ++对象析构函数(至少在某些版本的语言中)。请注意,C ++异常 do 在Objective-C ++中的行为与预期相同;我指的是您必须使用@try捕获的Objective-C异常。鉴于C ++中的RAII风格类,我能想到的唯一清理解决方案是添加一个执行条件清理并明确调用它的方法,如下所示:

@try
{
    SomeRAIIStyleObject x;
    doSomethingThatMightTriggerObjCException(x);
}
. . .
@finally
{
    x.tearDownIfNeeded();
}