把看到的,碰到的先记录在这里
1. 整形定义的时候使用L,小写的l容易和1混淆。无符号的要加UL。
注释:对于一些应用比较重要,如定义下面一个宏,如果不加UL,就有可能发生溢出
#define SECOND_OF_YEAR (365*24*60*60)UL
2. 关于int和long型长度的定义: C语言标准规定,int长度不小于16bit,long型不小于32位,具体的实现取决于编译器的实现和具体硬件的实现。
注释:在嵌入式应用开发中,这个问题是一个陷阱,某些16位机就会将int规定为16bit而不是我们常见的32bit。甚至char型也是16bit。
3. 函数定义和声明:如果我们在调用一个函数的时候,没有采用extern来声明,对于函数的返回值,编译器会默认为int类型。很不幸的是如果你没有打开编译器对类型声明的严格检查,摔跤是难免的。
注释:如在a.c文件中定义了一个函数double add(double a,double b),在b.c中没有使用extern double add(double a,double b);来声明函数就直接调用,那么add默认返回的值将是int类型而不是期望的double类型。
4. 字符串字面值的链接技巧:对于很长的字符串,书写和阅读都不方便,可以采用下面的技巧
4.1 puts("第一行字符串"
"第二行字符串"
"第三行字符串");
连接的结果:"第一行字符串第二行字符串第三行字符串"
注释: 利用编译器字符串连接规则--两个相邻的仅由空格,制表符和换行符分开的字符串字面值,可以连接成一个新的字符串字面值。其间的空格,制表符和换行符会被忽略.
4.2 puts("第一行字符串/
第二行字符串/
第三行字符串");
注释: 这个方法不常用,利用程序的格式化特性--在一行的末尾加一个反斜线符号'/'可以将此行和下一行当作同一行处理。但是反斜线后面不能有任何字符,包括注释。而且下一个行的开始的空格也将被视为有效字符。
5. 有相同名称的局部变量和全局变量的时候,局部变量优先。
6. struct 和 class定义的区别:唯一的区别在于默认的访问级别,struct的成员默认是public,class的级别是private
7. pack的使用: 对于要在不同系统间进行通信的时候,而且通信传送的数据结构是struct类型,使用pack很有必要,以保证正确的填充.