如何使用#define定义NULL

时间:2010-02-24 11:40:52

标签: c++ c null

我想在我的程序中重新定义NULL,例如

#define MYNULL ((void*)0)

但是这个定义在以下声明中不起作用:

char *ch = MYNULL;
  
    

错误:无法从void *转换为char *

  

定义NULL的最佳方法是什么?

8 个答案:

答案 0 :(得分:28)

#define MYNULL NULL

是最安全的,我认为没有理由这样做,但如果你真的想这样做,请继续。 以下是C和C ++分别执行的操作:

#define NULL 0 //C++
#define NULL ((void*)0) //C

一般来说,为NULL定义0是一个坏习惯,你实际上希望它成为语言的一部分。 C ++ 0x解决了这个问题。

这是Bjarne Stroustrup对say on this的所作所为:

  

我应该使用NULL还是0?

     

在C ++中,NULL的定义是0,   所以只有美学   区别。我更喜欢避免使用宏   所以我使用0. NULL的另一个问题   是人们有时会误入歧途   相信它与0不同   和/或不是整数。在预标准   代码,NULL有时被定义为   不合适的东西,因此   已经/必须避免。那就少了   这几天很常见。如果你必须命名   空指针,称之为nullptr;   这就是它的内容   的C ++ 0x。然后,“nullptr”将是一个   关键字。

答案 1 :(得分:17)

#ifdef __cplusplus
#define MYNULL 0
#else
#define MYNULL ((void*)0)
#endif

将适用于他们两个。

答案 2 :(得分:9)

从您应该的位置获取NULL的问题究竟是什么?,即

#include <stddef.h>

 #include <cstddef>
在@Johannes Rudolph的回答中提到,你所做的任何诡计都不太可能成为面对nullptr等事情的未来证据。

编辑:当stdlib(和许多其他人)被强制要求包含NULL时,stddef是最规范的标题[并且已经存在了几十年]。

PS一般来说,除非你有充分的理由,否则参与这种诡计只是一个坏主意。你没有扩大思维导致你觉得有必要这样做。如果你可以添加一些细节,它可能会带来更好的答案。回答这个问题的其他人也应该在他们的答案中指出这一点,但我认为FGITW做得最好:D

编辑2:正如@Yossarian所指出的:这样做的唯一理由是,如果在系统的其他地方没有以适当的语言无关的形式定义NULL。没有标题和/或如果您从头开始编写自己的自定义标准库的裸编译器就是这种情况的例子。 (在这样一个简单的场景中,我会选择@lilburne的答案(务必尽可能使用0))

答案 3 :(得分:2)

#define MYNULL 0

将在C ++中使用

答案 4 :(得分:1)

我认为任何不知道将C / C ++中的指针设置为0的人与将其设置为NULL,nullptr或任何其他等价物的人都不应该混淆代码。

之间的可读性差异
char* ch = NULL

char* ch = 0;

很小。表达形式

if (NULL == ch) {
}
if (0 == ch) {
}
if (nullptr == ch) {
}

不比

更具可读性
if (!ch) {
}

答案 5 :(得分:1)

不要这样做。 没有任何内容表明NULL必须是零值,它是特定于实现的。

它可以是一个表示内存结束的值,内存中的某个特殊位置,甚至是不存在任何值的对象。

这样做非常危险,可能会破坏可移植性,并且肯定会使用代码感知编辑器。它不是给你买任何东西,相信你的图书馆的定义。

编辑: Evan是正确的!代码本身会说零,编译器可以根据实现特定的细节做它想做的事情。谢谢Evan!

答案 6 :(得分:0)

与某些人在这里所说的相反,0是C中NULL的完全有效定义。因此,当你将NULL作为变量函数的参数时,你必须要小心,因为它可能被误认为是整数值0,以不可移植性结束。

http://c-faq.com/null/null2.html

BTW,comp.lang.c FAQ是每个C程序员强烈推荐的读物。例如,见:

http://c-faq.com/null/null1.html

包含几乎被遗忘的智慧的宝石,如“如上所述,每个指针类型都有一个空指针,不同类型的空指针的内部值可能不同。”这意味着calloc或memset不是指针的可移植初始化。

答案 7 :(得分:0)

#define NULL 0 //for C

是C

中的完美定义

e.g。

char *ch = NULL ;
*ch++ ;// will cause error

它会导致错误,因为ch在执行递增语句时没有指向任何内容 编译器通过查看LOOK-UP表中指针的值为0来了解

如果您尝试更新此指针,那么您实际上正在更改其内容 从0物理地址开始的CODE区域。 因此,代码区域之前的页表的第一个条目开始 保持空白

从您应该的位置获取NULL的问题究竟是什么?,即

#include <stddef.h>

#include <cstddef>
正如在@Johannes Rudolph的回答中提到的那样,你所做的任何诡计都不太可能成为面对像nullp等事情的未来证据。

编辑:当stdlib(和许多其他人)被强制要包含NULL时,stddef是最规范的标题[并且已经存在了几十年]。

PS一般来说,除非你有充分的理由,否则参与这种诡计只是一个坏主意。你没有扩大思维导致你觉得有必要这样做。如果你可以添加一些细节,它可能会带来更好的答案。回答这个问题的其他人也应该在他们的答案中指出这一点,但我认为FGITW做得最好:D

编辑2:正如@Yossarian所指出的:这样做的唯一理由是,如果在系统的其他地方没有以适当的语言无关的形式定义NULL。没有标题和/或如果您从头开始编写自己的自定义标准库的裸编译器就是这种情况的例子。 (在这样一个简单的场景中,我会选择@lilburne的答案(务必尽可能使用0))