Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C NULL宏和nul_C - Fatal编程技术网

C NULL宏和nul

C NULL宏和nul,c,C,如果代码中主要使用常量,我们将使用宏来定义常量。 为什么将“NULL”定义为宏,而将nul(\0)定义为宏?宏必须扩展为非宏的内容。它不是。\0是一个八进制字符常量(表示二进制0),因此可以放在字符中。NULL不是空的 NULL表示无法访问的地址,其内部值取决于实现。但是,当在代码中用作指针时,它总是表示0,因此像if(p==NULL)这样的测试与if(!p)可能有一些微妙的原因可以用来证明这种差异,但我希望对零字符(ASCII中名为NUL的)不需要宏 NULL可以是实现选择的任何空指针常量,它

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

宏必须扩展为非宏的内容。它不是。

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


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

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

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

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


您建议的宏将始终扩展为值为0的
int
。“我们需要更多的写零的方法”在我看来并不是那种能激励C标准委员会采取行动的事情,即使它是被提议的。如果有一组宏命名基本执行集中的字符,那么在该集合中为
NUL
指定一个宏是有意义的。但是人们似乎乐于编写
'a'
而不是
拉丁字母a
'\n'
而不是
换行符
0
'\0'
而不是
NUL
,为什么1不被定义为宏
ONE
?为
'\0'
,即
0
,设置宏有什么意义?对于
NULL
它表示它是一个指针。@DanielFischer:除了
NULL
不能保证它是一个指针之外。所以它实际上只是表示作者非常希望你想象它是一个指针,但并不关心它是否真的是;-)对,@Steve,我应该写“在指针上下文中使用”之类的。正确。转义序列的ascii值是27。因此,每当我们需要检查包含字符串的指针是否已完成时,我们可以使用值27定义的宏,而不是使用“\0”。@Angus
”\0“
的ASCII值为0,它与
“\ESC”
?@Angus:ASCII 27是
ESC
”无关,但这和零终止字符无关,所以NULL是(void*)0=指向0 loc的地址,nul是0。我现在明白了:)虽然NULL可能不是地址零,但它将始终被视为0(正确的形式在内部处理)。e、 g.
p=NULL;如果(p).
将失败。