当前位置:网站首页>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
边栏推荐
- Offer brush questions - 1
- 第02章 MySQL的数据目录【1.MySQL架构篇】【MySQL高级】
- JVM:运行时数据区-PC寄存器(程序计数器)
- Data Analysis 6
- 表的创建、修改与删除
- Datagrip error "The specified database userpassword combination is rejected..."Solutions
- 配置我的kitty
- 好的plm软件有哪些?plm软件排行榜
- Summary of test points about app updates in different ways
- VoLTE Basic Learning Series | Enterprise Voice Network Brief
猜你喜欢
随机推荐
LevelSequence源码分析
Dbeaver connect the MySQL database and error Connection refusedconnect processing
七夕来袭——属于程序员的浪漫
VoLTE Basic Learning Series | Enterprise Voice Network Brief
"By sharing" northwestern university life service | | bytes a second interview on three sides by HR
app 自动化 打开app (二)
13 - JUC CountDownLatch concurrent programming
【杭电多校第四场 B题】最短路图+缩点dp
nodetype中值1、2、3分别代表什么意思
数据分析5
基于百度OCR的网站验证码在线识别
Classwork (7) - #598. remainder operation (mod)
05-SDRAM: Arbitration
HPC系统简介
The socket option
22牛客多校1 I. Chiitoitsu (概率dp)
小程序通过云函数操作数据库【使用get取数据库】
pytest接口自动化测试框架 | 跳过模块
Fist game copyright-free music download, League of Legends copyright-free music, can be used for video creation, live broadcast
我三本学历,五面阿里,被面试官“供”着出来了,拿了33*15的Offer