codeblocks 16.01 中使用C++的nullptr

2017-04-25

1. nullptr头文件:

std::nullptr_t定义在标准头文件中。但实际上在源程序中不包含该头文件仍可以正常使用nullptr_t类型与nullptr对象。

2. nullptr的简介:

[转自wikipedia]

nullptr是c++11语言标准用来表示空指针的常量值。
在C语言中,空指针的值表示为#define NULL (void )0。
在C++语言中,由于对语法的类型检查更为严格,因而空指针的值就不能表示为(void
)0;。例如,空指针的值表示为FILE fp=(void )0;编译报错。所以至少自C++98开始#define NULL 0,但这会在函数重载时遇到新的困难。eg.

1
2
3
4
5
void foo(char c, void *p);
void foo(char c, int i);
int main(){
foo('x',NULL);//匹配哪个版本的foo()?
}

C++11开始,定义了空指针的常值为nullptr,解决了上述函数重载问题。
在没有C++11的nullptr时,可以自己实现一个:

1
2
3
4
5
6
7
8
9
10
11
const class nullptr_t{
public:
template<class T>
inline operator T*() const { return 0; }
template<class C, class T>
inline operator T C::*() const { return 0; }
private:
void operator&() const;
}
nullptr = {};

3. 设置codeblocks支持nullptr:

如果程序中包含nullptr,且编译时报错
error: ‘nullptr’ was not declared in this scope

那么,你的编译器可能使用的还是较早版本的c++语言标准。要让它支持nullptr,可以进行如下设置:

1
2
3
4
5
6
7
Settings
-Compiler
-Compiler Settings
-Compiler Flags
-General:
勾上:Have g++ follow the c++11 ISO c++ language standard
ok

注意:我的codeblocks版本是:16.01