如何在 .cpp 文件中使用 NULL?

3

我现在正在学习唯一实例(用c++编写),并在我的.cpp文件中尝试了以下代码。

#include "OnlyInstance.h"

OnlyInstance* OnlyInstance::instance = NULL;
..........

但编译器告诉我:“error C2065:'NULL':未声明的标识符”。这是否意味着我应该?
#include <stdio.h> 

在它前面?但我也在主文件中包含了stdio.h。那么在编译时会多次包含stdio.h,对吗?我该如何正确使用NULL?
另一个问题是,我知道可以用0替代NULL,但在C++中哪种方法更推荐?

1
顺便提一下,因为你正在用NULL初始化一个静态指针,你也可以简单地省略初始化程序。 - Deduplicator
2个回答

11

NULL 在不同的头文件中有定义,例如在 <cstddef> 中。

然而,如果你的编译器支持,应该优先使用 nullptr 而非 NULL

多次包含同一个头文件通常也没有问题(除非这个头文件非常糟糕,标准头文件一般都不是这样的情况)。


1
它应该适用于C++11及更高版本。 - Deduplicator
但是,如果我在OnlyInstance.cpp和main.cpp中同时使用#include <stdio.h>,然后在main.cpp中使用#include 'OnlyInstance.h',编译器会怎么做呢?stdio.h会被包含两次吗?谢谢! - Cong Wang

5

NULL只是一个值为0的定义,它与0完全相同。

但是如果您可以访问C++11,我建议使用nullptr。


1
实际上,它可能是其他东西。这也是偏爱nullptr的原因之一。 - Deduplicator
从技术上讲,它是一个与指针相同大小的0,因此它可以是0或0L或0LL,具体取决于哪种整数类型与指针匹配。否则,像printf("%p", NULL);这样的事情就会出错。 - Mats Petersson
@MatsPetersson:有时候为了隐藏错误,这是很好的选择。但并不能保证一定有效。 - Deduplicator
好的,也许不是所有编译器都适用,但根据我的经验,它比我实现printf时遇到的一些测试代码中的printf("%p", 0);效果要好得多——花了一段时间才发现问题,因为它比这个注释中的代码隐藏得更深... - Mats Petersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接