NULL宏和nul

时间:2013-03-07 14:26:30

标签: c

如果代码中主要使用常量,我们将使用宏来定义常量。 为什么将“NULL”定义为宏,为什么nul(“\ 0”)未定义为宏?

3 个答案:

答案 0 :(得分:4)

可能有一些微妙的原因可以用来证明差异的合理性,但我希望零字符的宏不需要(在ASCII中命名为NUL)。

NULL可以是实现选择的任何空指针常量,它可以是整数或指针。因此,当您需要一个空指针常量时,它会被使用,但您不希望给读者一个关于使用哪个空指针常量的印象。基本上,当您希望它是一个空指针时,您可以使用它来初始化/分配指针。您还可以在测试指针是否为空时使用它。

并非所有人都使用NULL0是允许的NULL值,因此您可以移植使用NULL的任何地方,您都可以使用0。就个人而言,如果它没有NULL,我认为C语言不会更差。特别是,在varargs函数中传递NULL会遇到麻烦,因为人们通常认为它是一个指针,如果需要它会转换为指针,但varargs函数不会转换它。因此,如果它不是指针需要指针,那么你得到UB。这同样适用于没有原型范围的函数。

你建议的宏总是会扩展为int,其值为0.“我们需要更多的写零方式”在我看来并不会激发C标准委员会采取行动,即使有人提议。如果有一组宏命名基本执行集中的字符,那么在该集合中为NUL设置一个宏是有意义的。但是人们似乎很乐意写'a'代替LATIN_LOWERCASE_A'\n'代替LINEFEED0'\0'代替NUL }。

答案 1 :(得分:2)

宏必须扩展为不是宏的东西。它不是turtles all the way down

答案 2 :(得分:1)

\0是一个八进制字符常量(表示二进制0),因此可以放在char中。 NULL不是。

NULL表示无法访问的地址,其内部值取决于实现。它在代码中用作指针时始终表示为0,因此像if (p == NULL)这样的测试与if (!p)相同。