【问题标题】:C++ Backend, Objective C frontend, NULL nil problemC++ 后端,Objective C 前端,NULL nil 问题
【发布时间】:2011-11-08 10:04:41
【问题描述】:

我有一个有趣的问题,我相信有人会遇到。我在 Objective C Cocoa 中编写前端 UI,在 C++ 中编写后端。在 C++ 中我有

#define NULL 0

不幸的是,这对 nil 产生了可怕的后果。特别是对于 nil 终止的函数调用,因为我现在收到此警告 - “方法调度中缺少哨兵”,我认为这意味着它找不到 nil 终止符。这是我能找到的关于 nil 的唯一定义:

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

在我看来,nil 是 NULL,而我之前对 NULL 的定义正在搞砸一切,尽管我不知道怎么做。 NULL 在 C++ 中定义,因此它可以独立于平台。我曾尝试重新定义 NULL 和 nil,但似乎没有任何意义。任何有关正确方法的建议将不胜感激。

【问题讨论】:

  • 我想我明白你想做什么......但可以举一个具体的例子吗?
  • 当我使用#define NULL 0 后,基本上'nil' 会停止正常工作。所以像 [[NSGradient alloc] initWithColorsAndLocations:... nil] 这样的定义不适用于该定义。但是后端需要定义。
  • 你为什么需要这个定义? C++代码只能使用0NULL 宏仅用于向后兼容 C。

标签: c++ objective-c xcode cocoa


【解决方案1】:

在 C 或 C++ 中,尝试自己定义 NULL 会导致未定义的行为。对不起,但你只是被允许这样做。您需要包含已经为您定义的标题之一,而不是尝试自己定义。

【讨论】:

  • 我认为它非常适合这种情况,因为 C++ 代码可以与 Objective C 代码共存。例如,如果我决定使用 Java 前端或 Javascript 前端,则不会定义 NULL。
【解决方案2】:

您可以在 .h/.cpp 中使用它时对其进行#define。然后,在这些文件的末尾,#undef NULL 以便 ObjC 的定义接管。这样定义就被清理了。

【讨论】:

    【解决方案3】:

    让我想起了我最近看到的这个问题:How to wrap a C++ lib in objective-C?

    那么,怎么样:

    #ifdef __cplusplus
    #define NULL 0
    #endif 
    

    【讨论】:

      【解决方案4】:

      您也可以在 C++ 中简单地使用 0 而不是 NULL

      【讨论】:

      • 那么你作为人类程序员遇到了与 Objective-C 编译器相同的问题:你的意思是在那里传递一个零,还是空指针常量?在函数和 C++ 方法调用中进行三重调用,其中参数未在调用中命名,因此您无法始终判断某物是需要数字还是指针。 NULLnil 就是因为这个原因而存在的。
      • 好吧,NULL 只是一个#define,所以它并没有真正起到任何作用(除了让代码更清晰一些,对某些人来说)。就个人而言,我更喜欢使用 0,就像 Stroustrup (IIRC) 一样,但这更多的是风格问题而不是实质问题。 C++0x 提供nullptr,这是一个更好的选择(它是类型安全的,即你不能将它用作需要int 的函数的参数,它与NULL 一样清晰)。
      猜你喜欢
      • 2011-05-02
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2011-02-06
      相关资源
      最近更新 更多