如何使用#define定义NULL

cpp*_*dev 8 c c++ null

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

#define MYNULL ((void*)0)
Run Code Online (Sandbox Code Playgroud)

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

char *ch = MYNULL;
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*lph 28

#define MYNULL NULL
Run Code Online (Sandbox Code Playgroud)

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

#define NULL 0 //C++
#define NULL ((void*)0) //C
Run Code Online (Sandbox Code Playgroud)

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

这就是Bjarne Stroustrup对此所说的:

我应该使用NULL还是0?

在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免.这些日子不太常见.如果必须命名空指针,则将其命名为nullptr; 这就是它将在C++ 0x中调用的内容.然后,"nullptr"将是一个关键字.


not*_*row 17

#ifdef __cplusplus
#define MYNULL 0
#else
#define MYNULL ((void*)0)
#endif
Run Code Online (Sandbox Code Playgroud)

将适用于他们两个.

  • 问题是"如何在C++和C中使用#define定义NULL",正如我所理解的那样,如果我等到有人实现了c ++ 0x,那么它不是"如何处理NULL",或者"有没有"警告使用NULL'.你为什么不假设cppdev知道他到底在做什么,只是想回答这个问题?这就是我讨厌stackoverflow的问题 - 通常我有理由使用我的解决方案,并且不希望提示如何以其他方式执行此操作.(好吧,问题没有前提可以假设这一点).使用你的魔法球和其他未来的配件来获得更有趣的东西. (9认同)
  • -1这是一个坏主意,如其他答案所述 (4认同)
  • 给我一个-1评论和一个愿意支持他们的意见和/或证明它的理由,并解释为什么他们在任何一天感觉它正确超过-1.对于像这个问题这样微妙的事情,让暴徒根据潜在的有缺陷的理解来解决问题,使用downvotes取消基于不完全理解的upvotes是不够好的.我不得不说,与我看到的其他人相比,这个问题上的标签发生了更多的废话.正如我所说,我们都讨厌SO :( (3认同)
  • @Yossarian:一个很好的问题(值得许多赞成)的一部分是FizzBin和/或以其他方式确定你所拥有的并且没有尝试在你决定用你的重要问题打扰LazyWeb的路上.并且不要担心成为这个星球上唯一受到SO烦恼的人,并且它有很多+和(不是很多) - 点(在任何意义上说):P但是当我们分裂头发时,你真的会想到那么,根据网站上的所有其他答案来衡量,这一个是唯一值得96代表?(不,我的答案不值60 - 这是一个评论的重复).去约翰内斯! (2认同)

Rub*_*ink 9

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

#include <stddef.h>
Run Code Online (Sandbox Code Playgroud)

要么

 #include <cstddef>
Run Code Online (Sandbox Code Playgroud)

正如在@Johannes Rudolph的回答中提到的那样,你所做的任何诡计都不太可能成为面对诸如此类事物的未来证明nullptr.

编辑:虽然stdlib(和许多其他人)被强制要求包括a NULL,stddef是最规范的标题[并且已经持续了数十年].

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

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