1 c编译器预处理功能
字符串替换,包含头文件,通用模块扩展
2 关于编译器的特性
不可移植的代码
未确定的
未定义的
坏的代码
编写可移植的代码:1)最好严格遵循语言标准 ,只使用已经确定的特性2)不突破任何由编译器所实现的限制 3)对于未确定的、未定义的、不产生依赖代码
3 关于通用模块扩展(宏的使用)
一般宏用法,括号会产生错误的表达形式
#define a(x) a_expanded(x)
a(x);
等价于 a_expanded(x)
如果有空格
#define a (y) a_expanded (y)
a(x);
实际上变为:(y) a_expanded (y)(x)
4 数值类型自动升级
最好使用有符号型数值变量,对于无符号类型很容易带来数值自动升级后的错误运算
或者用强制类型转换。
#define TOTAL_ELEMENTS (sizeof(array)/(sizeof(array[0])))
int d=-1,x;
if(d<TOTAL_ELEMENTS)
{}
else
{}
5 关于#pragma
向编译器提供一些信息,例如包含特定的函数库。