一直觉得写了这么久代码,对c,或者c++的掌握还算不错,可是最近才发现,不了解的细节实在太多了。
比如下面这个例子:
// 1. c
int print_float(float f)
{
return print("%f\n", f);
}
// 2. c
int main()
{
int a = 1;
print_float(a);
return 0;
}
gcc -c *.c && gcc -o test *.o && ./test
很简单的一段代码,可是打印出来的结果却是:
0.000000
为什么会出现这样的结果?其实就是题目中说道的:c的隐式声明。
如果没有关于被调函数的特定信息,编译器便假定在这个函数的调用时传递的参数类型和个数都是正确的,同时会假定函数返回一个整数类型的值。
但是如果被调函数的返回值不是整型,或者实参与形参不匹配,都将导致函数调用出现错误。
这个问题看似简单,却可以隐藏的非常深,而解决方式也无非就是秉持一种良好的编程习惯:
任何时候,都要声明函数。
比如在上面的例子中,只需要在main函数前面声明:int print_float(flat f),就可以了。
c和c++中类似这样的小问题,数不胜数。看来永远都没有精通c++的那一天了,想想都觉得好伤感。
(原文时间2014-3-18)