如果代码中主要使用常量,我们将使用宏来定义常量。为什么将 "NULL" 定义为宏,为什么 nul("\0") 未定义为宏?
3 回答
可能有一些微妙的原因可以用来证明差异的合理性,但我希望零字符(以NUL
ASCII 命名)不需要宏。
NULL
可以是实现选择的任何空指针常量,它可以是整数或指针。所以当你需要一个空指针常量时使用它,但你不想给读者留下这样的印象,即使用哪个空指针常量很重要。基本上,当您希望它为空指针时,您可以使用它来初始化/分配指针。您也可以在测试指针是否为空时使用它。
不是每个人都愿意使用NULL
. 0
是 的允许值NULL
,因此您可以在任何可以便携使用的地方NULL
使用0
。就我个人而言,我认为 C 语言如果没有NULL
. 特别是,传入NULL
可变参数函数可能会遇到麻烦,因为人们通常认为它是一个指针,如果需要它会转换为指针,但可变参数函数不会转换它。因此,如果它不是需要指针的指针,那么您将获得 UB。这同样适用于范围内没有原型的函数。
您提出的宏总是会扩展为int
值为 0 的。“我们需要更多的写零的方法”在我看来并不是那种会激发 C 标准委员会采取行动的事情,即使它是被提出的。如果有一组宏命名基本执行集中的字符,那么NUL
在该集中有一个 for 是有意义的。但是人们似乎很乐意写'a'
而不是LATIN_LOWERCASE_A
,'\n'
而不是LINEFEED
,和0
或'\0'
而不是NUL
。
宏必须扩展为不是宏的东西。一路下来都不是乌龟。
\0
是一个八进制字符常量(表示二进制 0),因此可以放在char
. NULL 不是。
NULL
表示无法访问的地址,其内部值取决于实现。但是,当在代码中用作指针时,它始终表示 0,因此类似的测试if (p == NULL)
与if (!p)
.