如果代码中主要使用常量,我们将使用宏来定义常量。 为什么将“NULL”定义为宏,为什么nul(“\ 0”)未定义为宏?
答案 0 :(得分:4)
可能有一些微妙的原因可以用来证明差异的合理性,但我希望零字符的宏不需要(在ASCII中命名为NUL
)。
NULL
可以是实现选择的任何空指针常量,它可以是整数或指针。因此,当您需要一个空指针常量时,它会被使用,但您不希望给读者一个关于使用哪个空指针常量的印象。基本上,当您希望它是一个空指针时,您可以使用它来初始化/分配指针。您还可以在测试指针是否为空时使用它。
并非所有人都使用NULL
。 0
是允许的NULL
值,因此您可以移植使用NULL
的任何地方,您都可以使用0
。就个人而言,如果它没有NULL
,我认为C语言不会更差。特别是,在varargs函数中传递NULL
会遇到麻烦,因为人们通常认为它是一个指针,如果需要它会转换为指针,但varargs函数不会转换它。因此,如果它不是指针需要指针,那么你得到UB。这同样适用于没有原型范围的函数。
你建议的宏总是会扩展为int
,其值为0.“我们需要更多的写零方式”在我看来并不会激发C标准委员会采取行动,即使有人提议。如果有一组宏命名基本执行集中的字符,那么在该集合中为NUL
设置一个宏是有意义的。但是人们似乎很乐意写'a'
代替LATIN_LOWERCASE_A
,'\n'
代替LINEFEED
,0
或'\0'
代替NUL
}。
答案 1 :(得分:2)
宏必须扩展为不是宏的东西。它不是turtles all the way down。
答案 2 :(得分:1)
\0
是一个八进制字符常量(表示二进制0),因此可以放在char
中。 NULL不是。
NULL
表示无法访问的地址,其内部值取决于实现。它在代码中用作指针时始终表示为0,因此像if (p == NULL)
这样的测试与if (!p)
相同。