代码之家  ›  专栏  ›  技术社区  ›  Luke

为什么在Objective-C中将零预处理为((void*)0?

  •  2
  • Luke  · 技术社区  · 7 年前

    nil 在Objective-C文件中,选择Product>执行操作>预处理“MySourceFile.m”, ((void *)0)

    1. 如果 是语言的一部分,为什么预处理器要对它做任何事情?为什么编译步骤不接受 直接地
    2. 变成 对象 ((id)0) ,如来源所示 this one
    2 回复  |  直到 7 年前
        1
  •  4
  •   zneak    7 年前

    “语言的一部分”不一定意味着“编译器的一部分”。例如,C标准力 NULL nil 表示缺少对象的标记。

    并不总是和 used to be defined as just 0 2007年左右 changed to __DARWIN_NULL ,在最新版本中 nullptr 在Objective-C++模式下 __DARWIN\u NULL 否则( __DARWIN\u NULL <sys/_types.h> .)

    Xcode对于查找“伪关键字”的定义有点令人讨厌。我发现对于Xcode作为关键字处理的宏(如 无效的 ),找到它们的定义位置的最佳方法是重新定义它们并查看错误消息。

    #define nil 0
            ^
    foo/main.m:29:9: warning: 'nil' macro redefined [-Wmacro-redefined]
    
    In module 'Foundation' imported from foo/main.m:9:
    In module 'CoreFoundation' imported from /.../Frameworks/Foundation.framework/Headers/Foundation.h:6:
    In module 'Dispatch' imported from /.../Frameworks/CoreFoundation.framework/Headers/CFStream.h:15:
    In module 'os_object' imported from /.../include/dispatch/dispatch.h:66:
    In module 'ObjectiveC' imported from /.../include/os/object.h:99:
    /.../include/objc/objc.h:108:12: note: previous definition is here
    #   define nil __DARWIN_NULL
               ^
    
        2
  •  2
  •   CRD    7 年前
    1. nil NULL 是(目标)C语言的一部分 ,也就是说他们不是 关键词 而是库/框架中预定义的常量/宏。

    值为0的整型常量表达式或转换为void*类型的此类表达式称为 . 如果将空指针常量转换为指针类型,则生成的指针称为 空指针 ,保证与指向任何对象或函数的指针进行比较。

    通常会包括演员阵容,以明确结果是 空指针常量 无效的