我想在我的程序中重新定义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)
将适用于他们两个.
从您应该的位置获取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尽可能多地使用))
| 归档时间: |
|
| 查看次数: |
5314 次 |
| 最近记录: |