0

我需要制作以下伪代码:

在 .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)。

谢谢你。

[编辑] 我发现了这个:如何在 C++ 中创建 Cocoa 对象?并且geovar的评论表明这是可能的,但是我在我拥有的XCode中找不到该选项(Snow Leopard的版本3.2 64位)。任何指针?

谢谢你。[/编辑]

4

1 回答 1

0

预处理器测试__OBJC__可用于有条件地在标头中声明 Objective-C 代码,该标头也可用于“纯”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++ 异常在 Objective-C++ 中的行为确实符合预期;我指的是你必须用@try. 给定 C++ 中的 RAII 样式类,我能想到的唯一清理解决方案是添加一个执行条件清理并显式调用它的方法,如下所示:

@try
{
    SomeRAIIStyleObject x;
    doSomethingThatMightTriggerObjCException(x);
}
. . .
@finally
{
    x.tearDownIfNeeded();
}
于 2012-06-30T06:18:41.493 回答