1、不要让main函数返回void,并且建议显式的调用 return 0;
2、区分0的4种面孔:整型0、空指针NULL、字符串结束标志 '\0'、逻辑false。
前两者都占32位,推荐在置空指针或比较指针时,使用NULL,如 int* i = NULL; if (i == NULL); 第三种是一个字符,占8字节。如 "Hello" 只有5个字符,却要分配6字符空间;第四种占用一个字节
3、不要忘记对局部指针变量的初始化,可以设置为NULL,否则会报警告;但对于全局指针变量来说,编译器会自己完成对它的初始化,不会报警告。
4、逗号表达式的值为最右边表达式的值,如 while(i++,j--)
5、拒绝晦涩难懂的函数指针。一般函数指针用于运行时函数回调,使用 typedef 简化。
6、防止包含重复的头文件,一个是使用 #ifndef 方式,一个是使用 #pragme once ,前者受C/C++标准支持,但每次编译时都需要打开头文件才能判定是否有重复定义,因此编译大型项目时较长,另外如果取名有重复,也会有问题。后者不受C/C++标准支持,仅受编译器支持,不过编译速度提升。(该书说GCC已经取消了对其的支持,难道是最新版的?有空试一下)。如果使用前者,可以采用GOOGLE建议的, _<PROJECT_PATH>_<FILE>_H_
7、优化结构体中的元素布局。 如 struct A{ int a; char b; short c;}; struct B{ char b; int a; short c;}; 则 sizeof(A) == 8 sizeof(B) == 12
可以使用 #pragma pack(n) 来设置结构体的对齐方式,默认为8,可以设为1,则上面结构体的长度为7。
字节对齐的三个原则:
一、结构体首字址能够被最宽基本类型成员的大小所整除。(没明白)
二、每个成员相对结构体首地址的偏移量都为自身大小的整数倍。
三、结构体总大小为结构体最宽基本类型成员大小的整数倍。
编程应用中,如果空间紧张,需要考虑节约空间,则将结构体中的变量按类型大小从小到大依次声明。