如果常量大多采用在代码中,我们将使用宏来定义一个常数。 为什么“NULL”被定义为宏,为什么nul(“\ 0”)没有被定义为宏?NULL宏和NUL
回答
有可能是一些微妙的原因,可以用来证明差异,但我希望没有需要为零字符的宏(名为NUL
在ASCII)。
NULL
可以是执行者选择的任何空指针常量,它可能是一个整数或指针。所以当你需要一个空指针常量的时候它会被使用,但是你不想给读者一个精确的印象,哪个空指针常量被使用。基本上,你可以用它来初始化/分配一个指针,当你希望它是一个空指针时。测试指针是否为空时,您也可以使用它。
不是每个人都使用困扰NULL
。 0
是NULL
允许的值,因此在任何地方,你可以可移植性使用NULL
,您可以使用0
代替。就个人而言,如果它没有NULL
,我认为C语言不会更差。特别是,你可以在可变参数函数中传入NULL
,因为人们通常认为它是一个指针,如果需要它会转换为指针,但可变参量函数不会将其转换。所以如果它不是一个需要指针的指针,那么你会得到UB。这同样适用于没有范围的原型的函数。
您提出的宏总是会扩展为值为0的int
。“我们需要更多的写零方法”在我看来,这不会促使C标准委员会采取行动,即使有人提议。如果有一组宏命名基本执行集中的字符,那么在该集合中有一个用于该字符的将是合理的。但人们似乎乐意写'a'
而不是LATIN_LOWERCASE_A
,'\n'
而不是LINEFEED
和0
或'\0'
而不是NUL
。
宏有扩大的东西,是不是宏。这不是turtles all the way down。
正确。转义序列的ascii值是27.因此,无论何时我们需要检查包含字符串的指针是否已完成,我们都可以使用由值27定义的宏而不是使用'\ 0'。 – Angus 2013-03-07 14:39:43
@Angus''\ 0''的ASCII值是0,它与'\ ESC''没有关系? – 2013-03-07 14:40:49
@Angus:ASCII 27是“ESC”,但与零终止字符无关。 – 2013-03-07 14:41:22
\0
是一个八进制字符常量(表示二进制0),所以可以放在一个char
。 NULL不是。
NULL
意味着不能被访问的地址,和其内部值是依赖于实现的。当它用作代码中的指针时,它始终代表0,所以像if (p == NULL)
这样的测试与if (!p)
相同。
- 1. Java字符串替换和NUL(NULL,ASCII 0)字符?
- 2. JavaScript文件坠毁并转化为“” NUL NUL NUL”记事本+
- 3. 字符为NUL
- 4. NUL字符在C#
- 5. NUL终止指针
- 6. dateFromString STILL返回nul
- 7. 仍出现错误信息,但> nul 2> nul
- 8. C是否有更多的宏像NULL?
- 9. 存储NUL字符(ASCII 0)
- 10. 如何打开“nul”文件?
- 11. 带NUL的SQLite字符串
- 12. 关于“NUL”的UWP CreateFile2 ERROR_ACCESS_DENIED
- 13. 嵌套宏和##
- 14. 宏中的#和##
- 15. Excel宏和VBA
- 16. NUL字符和静态字符数组/字符串在C
- 17. C++和嵌入式Python - NUL终止字符串
- 18. 什么是计算宏和语法宏
- 19. Java和宏项目
- 20. tikz的树和宏
- 21. C++宏和模板
- 22. base64解码 - 字符串中的nul
- 23. 写系统调用停靠在NUL
- 24. 字符串包含NUL字节
- 25. 从字节中删除NUL字符
- 26. 如何拆分壳体中的NUL
- 27. Sublime Text返回nul控制字符
- 28. 查找以NUL开头的文件
- 29. 为什么这些NUL的出现
- 30. 在变量中使用> nul
什么是'nul(“\ 0”)'? – Linuxios 2013-03-07 14:27:37
你的意思是''\ 0''? – Maroun 2013-03-07 14:29:53
为什么1不定义为宏'ONE'?为''\ 0'',又名'0'准备了一个宏是什么意思?对于NULL,它表示它是一个指针。 – 2013-03-07 14:30:02