为何未包含自定义库头文件,程序调用的函数仍可正常运行?
问题
我有一个C语言项目,包含三个文件:main.c、自定义库的increase.h和increase.c。在main.c里调用了increase.c中定义的inc函数,但我删除main.c里的#include "increase.h"语句后,原本以为程序会崩溃,结果却输出了正确结果。
下面是我的代码:
main.c
#include <stdio.h> #include <stdlib.h> int main() { int a =9,b= 5; printf("%d",inc(a)); }
increase.h
#ifndef INCREAS_H_INCLUDED #define INCREAS_H_INCLUDED int inc(int a); #endif
increase.c
int inc(int a) { return a+1; }
解答
- 这是C语言隐式函数声明规则在起作用:当编译器碰到未声明的函数调用时,会默认假设该函数返回值为
int类型,且参数类型和你调用时传入的参数完全匹配。 - 你的
inc函数刚好完全符合这个隐式假设:返回值是int,参数也是int,所以编译器生成的调用代码和实际函数定义完全兼容,程序自然能正常运行。 - 但这绝对是不安全的写法,一旦函数的返回值或参数类型和隐式假设不匹配,就会触发未定义行为——可能直接崩溃、输出错误结果,甚至表面正常但埋下难以排查的隐患。比如如果
inc返回值是float,或者参数是long,隐式声明就会导致调用逻辑彻底出错。 - 头文件的核心作用就是提供函数声明,让编译器在编译阶段就能检查函数调用的正确性,避免这种依赖隐式规则的风险。哪怕现在程序能跑,也必须把
#include "increase.h"加回去。
内容的提问来源于stack exchange,提问作者Mr. Nothing
相关产品推荐
相关产品推荐

