1 什么是C语言的隐式函数声明
在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是一个例子:
?
1
2
3
4
5
int main(int argc, char** argv)
{
double x = any_name_function();
return 0;
}
单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错。
?
1
2
3
4
5
[smstong@centos192 test]
gcc−cmain.c[smstong@centos192test]
gcc main.o
main.o: In function main':
any_name_function’
main.c:(.text+0x15): undefined reference to
collect2: ld 返回 1
之所以编译不会报错,是因为C语言规定,对于没有声明的函数,自动使用隐式声明。相当于变成了如下代码:
?
1
2
3
4
5
6
int any_name_function();
int main(int argc, char** argv)
{
double x = any_name_function();
return 0;
}
2 带来的问题
2.1 隐式声明函数名称恰好在链接库中存在,但返回非int类型
前面给出的例子,并不会造成太大影响,因为在链接阶段很容易发现存在的问题。然而下面这个例子则会造成莫名的运行时错误。
?
1
2
3
4
5
6
7