C语言二分查找程序出现bin函数隐式声明警告如何解决?
1. 如何解决该警告?
有两种可任选的简单解决方法:
- 在
#include<stdio.h>之后、sort函数定义之前,添加bin函数的原型声明:void bin(int a[],int size); - 调整两个函数的定义顺序,把
bin函数的完整定义放到sort函数的前面,保证编译器编译到sort里调用bin的代码时,已经获取到bin的完整类型信息。
2. 该警告的含义是什么?
两个警告为连续的因果关系:
- 第一个
implicit declaration of function 'bin'警告:C语言旧标准(C89)允许调用未提前声明/定义的函数,遇到这类情况时编译器会自动生成隐式声明,默认该函数返回值类型为int,参数类型按调用时传入的参数临时推断。你在sort函数内调用bin时,编译器还没读取到后续bin的定义,所以触发了隐式声明警告。 - 第二个
conflicting types for 'bin'警告:等编译器读取到你写的bin函数定义时,发现实际定义的bin返回值为void,和之前自动生成的隐式声明里的int返回值类型不匹配,因此报出类型冲突警告。
3. 为什么出现警告后程序依然可以正常运行?
这属于未定义行为下刚好运行正常的巧合:
你的bin函数本身不需要返回值,调用bin时也没有接收、使用它的返回值,所以隐式声明和实际定义的返回值类型差异没有被触发;同时你调用bin时传入的参数类型、数量和实际定义完全匹配,函数调用时的栈结构、参数传递都是正确的,所以执行逻辑没有出错,程序可以正常运行。
但这种写法是不安全的,如果后续修改bin函数需要返回值、或者调整了参数,很容易出现隐藏的运行错误。
内容的提问来源于stack exchange,提问作者Sahil Singh
相关产品推荐
相关产品推荐

