c语言gcc main的声明报错,《C语言 — 隐式函数声明implicit declaration 》

本文探讨了C语言中隐式函数声明的原理,展示了其在编译过程中的行为和可能引发的问题,特别关注了隐式声明与内建函数冲突的情况。通过实例和gcc编译器的行为,解释了为何在某些情况下会收到警告,并强调了编译器实现的差异性。
摘要由CSDN通过智能技术生成

1. 隐式函数声明概念

在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是一个例子:

int main(int argc, char** argv)

{

double x = any_name_function();

return 0;

}

单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错。

[smstong@centos192 test]$ gcc -c main.c

[smstong@centos192 test]$ gcc main.o

main.o: In function `main':

main.c:(.text+0x15): undefined reference to `any_name_function'(`any_name_function'引用没有定义)

collect2: ld 返回 1

之所以编译不会报错,是因为C语言规定,对于没有声明的函数,自动使用隐式声明。相当于变成了如下代码:

int any_name_function();

int main(int argc, char** argv)

{

double x = any_name_function();

return 0;

}

2.程序中造成的问题

前面给出的例子,并不会造成太大影响,因为在链接阶段很容易发现存在的问题。然而下面这个例子则会造成莫名的运行时错误。

#include

int main(int argc, char** argv)

{

double x = sqrt(1);

printf("%lf", x);

return 0;

}

gcc编译链接

[smstong@centos192 test]$ gcc -c main.c

main.c: 在函数‘main’中:

main.c:6: 警告:隐式声明与内建函数‘sqrt’不兼容

[smstong@centos192 test]$ gcc main.o

运行结果

1.000000

编译时会给出警告,提示隐式声明与内建函数’sqrt’不兼容。gcc编译器在编译时能够自动在常用库头文件(内建函数)中查找与隐式声明同名的函数,如果发现两者并不相同,则会按照内建函数的声明原型去生成调用代码。这往往也是程序员预期的想法。

上面的例子中隐式声明的函数原型为:

int sqrt(int);

而对应的同名内建函数原型为:

double sqrt(double);

最终编译器按照内建函数原型进行了编译,达到了预期效果。然而gcc编译器的这种行为并不是C语言的规范,并不是所有的编译器实现都有这样的功能。

3.隐式声明函数名称恰好在链接库中存在,且返回int类型

标签:function,gcc,int,C语言,declaration,main,声明,隐式

来源: https://www.cnblogs.com/zhuangquan/p/11757879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值