-2

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

4

3 回答 3

4

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

NULL可以是实现选择的任何空指针常量,它可以是整数或指针。所以当你需要一个空指针常量时使用它,但你不想给读者留下这样的印象,即使用哪个空指针常量很重要。基本上,当您希望它为空指针时,您可以使用它来初始化/分配指针。您也可以在测试指针是否为空时使用它。

不是每个人都愿意使用NULL. 0是 的允许值NULL,因此您可以在任何可以便携使用的地方NULL使用0。就我个人而言,我认为 C 语言如果没有NULL. 特别是,传入NULL可变参数函数可能会遇到麻烦,因为人们通常认为它是一个指针,如果需要它会转换为指针,但可变参数函数不会转换它。因此,如果它不是需要指针的指针,那么您将获得 UB。这同样适用于范围内没有原型的函数。

您提出的宏总是会扩展为int值为 0 的。“我们需要更多的写零的方法”在我看来并不是那种会激发 C 标准委员会采取行动的事情,即使它是被提出的。如果有一组宏命名基本执行集中的字符,那么NUL在该集中有一个 for 是有意义的。但是人们似乎很乐意写'a'而不是LATIN_LOWERCASE_A'\n'而不是LINEFEED,和0'\0'而不是NUL

于 2013-03-07T14:43:34.620 回答
2

宏必须扩展为不是宏的东西。一路下来都不是乌龟。

于 2013-03-07T14:32:38.133 回答
1

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

NULL表示无法访问的地址,其内部值取决于实现。但是,当在代码中用作指针时,它始终表示 0,因此类似的测试if (p == NULL)if (!p).

于 2013-03-07T14:38:12.500 回答