区分nil Nil NULL和NSNill(Objective C语言)

本文详细解析了Objective-C语言中nil、NULL和Nil的定义与用途,包括它们在代码中的应用及意义。重点阐述了这些关键字在实际编程中的作用与区别,以及NSNull类与nil的区别。

         nil Nil NULL和NSNill作为Objective C语言中出现比较频繁的字眼,有时候不知道如何到底该选择哪一个?下面我们来详细分析这几个关键字的区别。

         nil在OC中的通过jump to Definition指向的定义为:
        #ifndef nil
               #define nil NULL
        #endif /* ! nil */

       根据定义可以看出,其实nil只不过是NULL的另外一个别称而已。

       NULL在OC中的定义为:

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

        根据定义还看不出什么端倪。仔细搜索一下NULL的解释为,A null pointer to anything else,  is for C-style memory pointers.具体实现是: #define NULL ((void *)0)  。所以NULL是一种C风格的内存指针,并且为void类型,其值为0。

         nil和NULL都是在MacType.h中定义。并且NULL在nil之前定义。一般来说,NULL是C风格的,而nil是属于OC风格的。

         同样对Nil通过jump to Definition,会跳至objc.h文件中,Nil定义为:

          #ifndef Nil
                   #define Nil __DARWIN_NULL    /* id of Nil class */
          #endif
         还可以看到nil在该文件中定义:
          #ifndef nil
                  #define nil __DARWIN_NULL    /* id of Nil instance */
          #endif

         从该文件中对Nil和nil的定义可以看出,他们都是代表同样的对象。我们知道OC是一种区分字母大小写的语言,那为什么要定义Nil和nil呢?我们可以从Nil和nil后面的注释可以看出,Nil用来作为指向OC 空class的指针,而nil代表指向OC 空实例的指针。我想,这样定义应该是作为OC的编程规范吧!

         NSNull:其定义包含在Foundation.framework的NSNull.h中:

       #import <Foundation/NSObject.h>

        @interface NSNull : NSObject <NSCopying, NSCoding>

        + (NSNull *)null;

         @end

         从定义可以看出:NSNull是一个类,其含有一个类方法null,返回值为NSNull*。NSNull的实现采用单例设计模式。所以[NSNull null]返回一个NSNull实例。定义NSNull是由于集合对象中不能有nil值,所以用NSNull类来代表在集合对象中的null 值。英文解释:NSNull is a class defines a singleton object used to represent null values in collection objects (which don't allow nil values).
[NSNull null]: The singleton instance of NSNull.


总结:从技术实现上来说,nil、NULL都是一样的。但是实际上这种定义能够增加代码的可读性。如果你给某人传递NULL值,那么某人就认为接收到的是C指针。如果是nil,那么认为接受的是一个对象。而Nil,则认为接受的是class。

那么NSNull与nil之间的区别有哪些呢?

如何一个对象obj是nil,那么调用[obj message]将不会扔出NSException异常,并且会正常返回NO;

如果一个对象obj为NSNull,那么[obj message]将会扔出NSException异常。



<think>好的,我现在需要解决用户关于C语言nil的含义、用法以及相关替代的问题。首先,我需要确认用户提到的“nil”在C语言中的确切定义,因为在C标准中并没有nil这个关键字。通常,nil在编程中可能与其他语言如Lua或Objective-C相关,但在C中更常见的是使用NULL。 接下来,我需要回顾用户提供的引用内容。引用[1]提到Lua中变量可以赋值为nil,这与C不同,但用户可能混淆了不同语言的术语。引用[2]中的宏定义使用了nil,可能是在Objective-C的上下文中,因为iOS开发中常用nil表示空对象。而C语言中通常用NULL表示空指针。 然后,我需要明确C语言中的空指针定义。根据C标准,NULL是一个宏,通常定义为((void*)0)或0,用于指针的初始化或比较。用户可能看到某些代码中使用nil,但这可能是非标准的扩展,比如在某些编译器中或与其他语言的混合使用。 关于替代方案,用户可能想知道除了NULL之外是否有其他方式表示空指针。在C11标准中,还有nullptr关键字吗?不,C11并没有引入nullptr,那是C++中的。因此,C语言中主要还是使用NULL,或者直接赋值0,但最好使用NULL以提高可读性。 另外,用户可能对nilNULL的区别感到困惑,需要解释它们在不同上下文中的使用。例如,在Objective-C中nil代表空对象指针,而C中的NULL用于普通指针。同时,需要提醒用户避免在C中使用nil,因为它不是标准的一部分,可能导致编译器错误或不可移植的代码。 最后,总结回答时要结构清晰,分点说明定义、用法、替代方案,并指出注意事项,确保用户理解正确的用法潜在陷阱。同时,生成的相关问题应涵盖NULLnil的区别、检查空指针的方法以及不同语言中的类似概念,帮助用户扩展知识。</think>### C语言nil的含义与用法解析 #### 1. nil在C语言中的定义 严格来说,C语言标准(C89/C99/C11)**没有定义nil关键字**。但在某些特殊场景中: - 部分编译器扩展(如Objective-C混合编译环境)可能将`nil`定义为空对象指针[^2] - 某些第三方库可能自行定义宏: ```c #define nil ((void*)0) // 类似NULL的定义方式 ``` #### 2. 标准替代方案:NULL C语言标准推荐使用`NULL`表示空指针: ```c int *ptr = NULL; // 正确用法 if (ptr == NULL) { /* 处理空指针 */ } ``` - `NULL`在标准头文件<stddef.h>中定义 - 实际定义为`#define NULL ((void*)0)`(在指针上下文中) #### 3. 替代方法对比 | 表示方式 | 标准性 | 适用场景 | 示例 | |----------|-------------|--------------------------|----------------------| | NULL | 标准C | 通用指针类型 | `char *s = NULL;` | | 0 | 隐式转换 | 整型与指针混用场景 | `int *p = 0;` | | (void*)0 | 底层实现 | 需要显式类型转换时 | `return (void*)0;` | #### 4. 使用注意事项 1. **不可互换性**:`nil`在纯C代码中可能引发编译错误 ```c struct Node *n = nil; // 错误:除非显式定义过nil ``` 2. **类型安全**:C++中使用`nullptr`(但C语言不支持) 3. **函数返回**:返回空指针的标准写法 ```c int* create_array(int size) { if (size <= 0) return NULL; // ... } ``` #### 5. 跨语言对照表 | 语言 | 空指针表示 | 类型系统 | |-------------|------------|---------------| | C | NULL | 弱类型 | | Objective-C | nil/Nil | 对象系统 |[^2] | Swift | nil | 可选类型 | | Lua | nil | 动态类型 |[^1] [^1]: Lua中的nil表示变量未赋值状态 [^2]: Objective-C使用nil表示空对象指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值