2013-03-07 53 views
-2

如果常量大多采用在代码中,我们将使用宏来定义一个常数。 为什么“NULL”被定义为宏,为什么nul(“\ 0”)没有被定义为宏?NULL宏和NUL

+1

什么是'nul(“\ 0”)'? – Linuxios 2013-03-07 14:27:37

+0

你的意思是''\ 0''? – Maroun 2013-03-07 14:29:53

+1

为什么1不定义为宏'ONE'?为''\ 0'',又名'0'准备了一个宏是什么意思?对于NULL,它表示它是一个指针。 – 2013-03-07 14:30:02

回答

4

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

NULL可以是执行者选择的任何空指针常量,它可能是一个整数或指针。所以当你需要一个空指针常量的时候它会被使用,但是你不想给读者一个精确的印象,哪个空指针常量被使用。基本上,你可以用它来初始化/分配一个指针,当你希望它是一个空指针时。测试指针是否为空时,您也可以使用它。

不是每个人都使用困扰NULL0NULL允许的值,因此在任何地方,你可以可移植性使用NULL,您可以使用0代替。就个人而言,如果它没有NULL,我认为C语言不会更差。特别是,你可以在可变参数函数中传入NULL,因为人们通常认为它是一个指针,如果需要它会转换为指针,但可变参量函数不会将其转换。所以如果它不是一个需要指针的指针,那么你会得到UB。这同样适用于没有范围的原型的函数。

您提出的宏总是会扩展为值为0的int。“我们需要更多的写零方法”在我看来,这不会促使C标准委员会采取行动,即使有人提议。如果有一组宏命名基本执行集中的字符,那么在该集合中有一个用于该字符的将是合理的。但人们似乎乐意写'a'而不是LATIN_LOWERCASE_A,'\n'而不是LINEFEED0'\0'而不是NUL

2

宏有扩大的东西,是不是宏。这不是turtles all the way down

+0

正确。转义序列的ascii值是27.因此,无论何时我们需要检查包含字符串的指针是否已完成,我们都可以使用由值27定义的宏而不是使用'\ 0'。 – Angus 2013-03-07 14:39:43

+1

@Angus''\ 0''的ASCII值是0,它与'\ ESC''没有关系? – 2013-03-07 14:40:49

+1

@Angus:ASCII 27是“ESC”,但与零终止字符无关。 – 2013-03-07 14:41:22

1

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

NULL意味着不能被访问的地址,和其内部值是依赖于实现的。当它用作代码中的指针时,它始终代表0,所以像if (p == NULL)这样的测试与if (!p)相同。