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*)