extern
extern是C/C++中表明函数或全局变量作用域(可见性)的关键字,该关键字告诉编译器其修饰的符号可在本模块或者其他模块中使用。
与extern相对的是static关键字,被static修饰的符号只能在本模块使用。extern与static是对立的,不可能同时修饰同一符号。
C++中被extern "C"修饰的变量或者函数是按照C的规则进行编译和链接的,方便在C/C++混合编程。
C/C++混合编程中需要通过extern "C"来区分C符号的原因是:C++支持函数重载,C++编译出来的函数符号带有函数名和参数信息,而C编译出来的函数符号只有函数名信息。
static
static用法总览:

const
修饰变量,指针,类对象、类中成员函数
volatile
避免编译器指令优化
union
The purpose of union is to save memory by using the same memory region for storing different objects at different time.
nullptr
为什么C++开始引入nullptr表示空指针?
C++迷信类型转换不安全,禁止void*和其他类型指针之间的转换。
1
2
3
4
5
6
7
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
#endif
所以在函数重载或者模板推导时,NULL会被推导为int,导致有问题。
用来代替0或者NULL.
1
2
3
4
5
6
void f(int);
void f(void*);
f(0); // 调用f(int);
f(NULL); // 会有歧义,调用f(int) if NULL is 0。
f(nullptr); // 调用f(void*)