当前位置:网站首页>C语言中编译时出现警告C4013(C语言不加函数原型产生的潜在错误)
C语言中编译时出现警告C4013(C语言不加函数原型产生的潜在错误)
2022-08-01 07:37:00 【mary288267】
一 C语言中函数原型并不必要
一直以来用的是C++写程序,今天偶尔看到一段C程序,发现一个有趣的bug,现记录下来,备忘。
首先,C++在使用函数之前必须进行原型声明,否则无法编译通过。而C语言由于历史原因,函数原型声明在很多情况下并不是必须的。
- 在C89或C90(另一种名称叫ANSI C)规范中,函数声明并不是必须的;如果没有声明函数原型,函数的默认返回值为int,使用这种方式的原因是早期C程序的返回值大多是int 型的。C99不再支持函数的int类型为默认类型的设置。
- 在很多编译器中,并没有很好的支持C99标准。比如VS编译器,通过查看MSDN,可以知道VS的支持的是ANSI C,因此函数可以不加原型。

二 C语言不加函数原型产生的潜在错误
下面是个例子,演示了不加函数原型可能产生的一种错误。在VS中输入下面一段代码,文件后缀为.c,以保证编译为C程序。
#include <stdio.h>
int main()
{
int arg = 5;
float f = GetFloat(arg);
printf("\nf=%f", f);
return 0;
}
float GetFloat(int m)
{
double d = 2.0*m;
return d;
}
在编译过程中出现警告信息,提示GetFloat函数没有定义,假设外部返回int。
我们继续运行,查看最终结果
f的值是1,错了。为什么呢?我们查看汇编语言
我们可以看到,编译器认为GetFloat函数应该返回整形,因此用寄存器eax的值赋给了浮点数寄存器xmm0,然后再用xmm0赋值给栈上变量f。而GetFloat函数实际的返回值放在xmm0寄存器中,因此上述赋值当然错误。
作为对比,我们看看有原型时编译器会怎么处理。
此时,编译后知道GetFloat返回的是浮点值,因此返回值存储在xmm0寄存器中,所以编译器用xmm0给栈中变量f赋值。当然,这次一定是正确的了。
三 总结
由于很多编译器仍然使用的是ANSI C标准,因此,不声明原型的话,会误导编译器以为函数的返回值是int类型,尤其是使用库函数时,我们忘记加了头文件,而编译时又没报错,但运行时出现错误的运行结果。在编程中,务必避免。
另外,有一个经典案例,可供大家参考。
https://stackoverflow.com/questions/55454761/write-acces-violation-after-using-malloc-inside-a-function
边栏推荐
猜你喜欢

如何使用Photoshop合成星轨照片,夜空星轨照片后期处理方法

目标检测概述-上篇

How to use Photoshop to composite star trail photos, post-processing method of night sky star trail photos

Introduction to the basic principles, implementation and problem solving of crawler

企业数据虚拟化综合指南

我三本学历,五面阿里,被面试官“供”着出来了,拿了33*15的Offer

22 Grab the Seat 1 C.Grab the Seat (Geometry + Violence)

华为深度学习课程第九章——卷积神经网络以及案例实践

日志导致线程Block的这些坑,你不得不防

VoLTE Basic Learning Series | Enterprise Voice Network Brief
随机推荐
Vim扩展内容
VoLTE Basic Learning Series | Enterprise Voice Network Brief
【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?
centos 安装php7.4,搭建hyperf,转发RDS
华为深度学习课程第六、七章
我三本学历,五面阿里,被面试官“供”着出来了,拿了33*15的Offer
How to generate and configure public key certificate in Alipay
并发编程13-JUC之CountDownLatch
special day to remember
国内外最顶级的8大plm项目管理系统
Chapters 6 and 7 of Huawei Deep Learning Course
案例实践 --- Resnet经典卷积神经网络(Mindspore)
支付宝如何生成及配置公钥证书
阿里三面:MQ 消息丢失、重复、积压问题,该如何解决?
"By sharing" northwestern university life service | | bytes a second interview on three sides by HR
mysql中添加字段的相关问题
目标检测概述-上篇
【杭电多校第四场 B题】最短路图+缩点dp
微信小程序请求封装
Gethostbyname \ getaddrinfo DNS domain name IP address is not safe