好的,我有一些C++代码在一个头文件中声明如下:
void StreamOut(FxStream *stream,const FxChar *name = nil);
我得到的错误信息是:
'nil' was not declared in this scope
nil是Pascal语言中的东西,对吗?
我应该使用NULL吗?
我以为它们都是一样的,或者至少是零,不是吗?
在C++中,你需要使用 NULL
, 0 或者一些新编译器中的nullptr。在一些圈子中,使用 NULL
和 0 可能会引起一些争论,但在我看来,NULL
的使用比0更为普遍。
#DEFINE NULL 0
和null_ptr != NULL
。null_ptr
仅用于表示没有值的指针,0是一个有效的指针值,但除嵌入式系统外,它可能是无效的。 - joshperrynullptr
- Channel9上有一些很好的视频介绍它:http://channel9.msdn.com/shows/Going+Deep/Stephan-T-Lavavej-Everything-you-ever-wanted-to-know-about-nullptr/ - Johannes Schaub - litb0
不是一个指针值,而是一个整数值,不受任何系统的限制。它可以被转换为指针值。请参见http://stackoverflow.com/questions/423823/whats-your-favorite-programmer-ignorance-pet-peeve/1331729#1331729。 - Johannes Schaub - litb0
既是整数又是指针,并且可能认为如果你执行ptr + 0
(肯定是一个“指针上下文”),那么你可以把一个指针和一个空指针相加等等......最好清楚地说明“当需要时,将0转换为NULL指针”,以避免混淆。 - Johannes Schaub - litbnil
在标准C++中不存在。请使用NULL
。
((void*)0)
,因此就C而言,sizeof(NULL)
保证等于sizeof(void*)
。 - David Rodríguez - dribeas0L
实际上是其中一个例子,是吗?感谢你的纠正。 - Steve JessopNULL
可以被定义为 (void *) 0
,但不一定要这样定义。在 C 中,NULL
也可以被定义为普通的 0
。实际上,在 C 中,NULL
甚至可以被定义为 '\0'
。因此,在 C 语言中,sizeof(NULL)
与 sizeof(void *)
不保证相同。 - AnT stands with Russia#define NULL 0
这只是一种标记空指针的标准方式(不确定是否已经发布)。变量值为0仍然是一个值。指向0(0x0000...(它是十进制零))的指针实际上指向无处。这只是为了可读性。
int *var1, var2;
var1 = 0;
var2 = 0;
尽管这两个赋值看起来相同,但它们并不相同。
在C++中,0是被推荐和常用的样式。
只需在开头添加
#define null '\0'
或者你可以选择其他的代替 null
,并坚持你喜欢的。在 C++ 中,null 的概念只是指向空指针 (0x0
)。
请注意,每个编译器可能都有自己的 null、nil、NULL 等定义,但最终它仍然是 0。
可能在你查看的源代码中有一个
#define nil '\0'
在头文件的某个地方...
NULL
定义为\0
是完全有效的。我会很惊讶地看到这样的实现,但是\0
仍然是定义NULL
的有效方式。 - AnT stands with Russia\ooo
... [被] 用于指定所需字符的值"。因此,\0
的值为零,是NULL的有效值。但我对C++中的false
不确定:它的值是false
而不是零,要变成零,需要升级为int或转换为另一个整数类型。但这需要整数和指针转换 - 因此将变得非法。但尽管如此,我尝试了各种实现,它们都接受false
。 - Johannes Schaub - litb我看到了一些有关为什么不使用0的评论。通常人们不喜欢魔术数字,或者有意义的数字。给它们起一个名字。在代码中,我宁愿看到 ANSWER_TO_THE_ULTIMATE_QUESTION 而不是 42。
至于 nil,在 Obj-C 中也使用 nil。我会很讨厌想到有人违反了非常流行的惯例(或者至少是我记得的),即使用 NULL,我认为这个应该在标准库头文件中。不过我已经有一段时间没有做 C++ 了。
'\0'
也是一样,尽管我认为ASCII_NUL宏至少与NULL一样有用。 - Steve Jessop