C语言函数原型疑问:未添加分号代码仍运行的原因
aireRectangle的函数原型分号代码还能运行? 嘿,这个问题其实涉及到C语言的历史标准差异和编译器的“兼容老代码”特性,我给你掰扯明白:
旧C标准的「隐式声明」漏洞
在C89(也就是最早的ANSI C标准)里,允许一种偷懒的写法:如果你调用一个函数之前没提前声明它,编译器会自动帮你做一个「隐式声明」——默认这个函数返回int类型,参数类型就是你调用时传的参数类型。如果你的aireRectangle刚好返回int,而且调用时传的参数类型和函数实际定义的完全匹配,那编译器就不会找茬,代码能正常跑起来。新C标准已经把这个漏洞堵上了
从C99开始,官方标准就彻底废除了隐式声明的规则,要求所有函数必须先声明(不管是写原型还是直接写函数定义)再调用。但很多编译器(比如GCC、Clang)为了兼容几十年前的老代码,默认还是允许这种写法,只是会偷偷给你弹个警告(比如warning: implicit declaration of function 'aireRectangle')——如果你没开编译器警告的话,可能根本没注意到这个提示。你的代码能跑的核心原因
要么你的编译器默认用了C89模式编译,要么就是它开启了兼容旧标准的选项,而且你的aireRectangle函数刚好符合隐式声明的假设:返回int,参数类型和调用时完全一致。但这种写法非常不安全——如果函数实际返回的是float,或者参数类型不匹配(比如你传了double但函数要int),隐式声明会导致未定义行为,程序可能突然崩溃,或者输出完全错误的结果。为什么教程要求加函数原型
教程是按照现代C标准来教的,函数原型(比如int aireRectangle(int largeur, int hauteur);)能让编译器在编译阶段就帮你检查参数类型、数量和返回值是否匹配,提前发现错误,这是专业的编程习惯,也是现在写C代码的硬性要求。
内容的提问来源于stack exchange,提问作者Nicolas

