Extern
1.extern int a;表示引用其它模块的全局变量a,此处只是声明 。
作用是告诉编译器该变量在其它地方已经有定义,如果实际没有,会在链接时报错。
一般在全局变量对应的头文件中声明,让其它模块包含
2.也可声明函数,但加不加效果一样。
3.声明数组可以不指定大小,但不可以声明为指针(因为数组是常指针?)
4.extern "C" 声明C函数 extern "C" int f(int a); 因为C++编译后函数名带参数类型,来支持重载,不加”C”,调用会被编译成_f_int,加了后编译成_f
或包含C头文件 extern "C"{
#include...
}//注意编译预处理指令必须单独一行
Inline
1.inline要与函数定义在一起,声明inline不起作用
2.inline函数一般写在头文件中,这样才能被其它模块调用,否则编译时找不到inline
3.类声明中的函数自动成为inline,所以写在声明里的set get不会影响效率,这样等于直接访问私有变量
宏
1. 使用宏时要注意加括号例如 M(a,b) (a)*(b) 有可能a是一个加表达式
2. 求结构体成员偏移 FIND(s,a) (size_t)&(((s*)0)->a)
3. #将参数转为字符串 ##连接多个参数名 ...变参
例如 x##y 会变成访问xy变量
4.宏多行定义加/
#define SUM(i,max,s) /
s = 0; /
for(i=1; i<max; i++) /
s += i;
#define MACRO(arg1, arg2) do { /
/* declarations */ /
stmt1; /
stmt2; /
} while(0) /* (no trailing ; ) */这么写目的是防止多一个; 如if语句块 if(0)
;;
Else// 多了个分号,else没有匹配
5.undef取消某个宏定义
Sizeof
1. sizeof是操作符 对类型要加括号,对变量可以不加括号 一般在编译时计算
2.计算结构体大小
结构体所有成员的偏移必须是该成员大小的整数倍
结构体大小是任意成员大小(即最大)的整数倍(不一定要求4字节对齐,例如3个char长度就是3)
struct s
{
double d;
char c;
}; 其大小为16
有子结构体时不考虑子结构体大小,子结构体首地址要是子结构体最大成员的整数倍
3.可以用pack预处理指令禁止对齐 (写入文件或者网络传输时用)
4. 类
sizeof 一个类时等于数据成员大小
static在全局数据区,不计入
如果有虚函数 则多一个虚函数指针 要注意虚函数指针的地址也要整除4
5.括号中的内容不被编译 用类型替代 sizeof(f())不会调用f() 而是用返回值的类型替代