可移植性缺陷
使用C语言的一个首要原因就是,C程序能够方便在不同的编程环境中移植。
ANSI C标准的发布能够在一定程度上解决问题,但并不是万应灵药。
可移植性是一个涵盖范围非常广泛的主题
Mark Horton在它的著作How to Write Portable Software in C中详细地讨论了这个主题。
应对C语言标准变更
ANSI C标注允许这样写,但在老的机器上不能运行。
double square(double x) {
return x * x;
}
以前旧的形式能在旧的机器上运行。
double square(x) double x; {
return x * x;
}
旧形式的声明:
double square();
省略了参数类型的说明,这在ANSI C标准中也是合法的。因为这样的声明并没有对参数类型
做成任何说明,这意味着如果在函数调用是传入了错误类型的参数,函数调用就会不声不响地失败。
double square();
int main() {
printf("%g\n", square(3));
}
参数类型不匹配,程序打印出来的将是一堆“垃圾信息”。
//error
上面的程序改写为这样:
double square(double);
int main() {
printf("%g\n", square(3));
}
3会自动转换为double类型。另一种改写方法是,在这个程序中显式地给函数square传入一个double类型的参数:
//correct
double square();
int main() {
printf("%g\n", square(3.0));
}
程序的生命期往往超过了编程人员最初的预期,即使这个程序只是编程人员出于自用目的而编写的。