函数声明与定义不匹配为何编译阶段不报错?
为什么函数声明与定义不匹配时编译阶段不报错?
这本质是编译与链接的分工差异导致的:
- 编译阶段(执行
clang++ -c)是单个源文件独立处理的,编译器只会检查当前源文件内的语法合法性、符号使用与声明的一致性,不会跨文件校验“声明的函数是否和其他文件里的定义匹配”。
具体到你的代码:
编译
main.cpp时:
它包含了math.h,拿到add(int, int)的声明,main里调用add(5, 10)完全符合这个声明的参数要求,语法和逻辑检查都通过,顺利生成main.o目标文件。编译
math.cpp时:
它同样包含math.h,知道有add(int, int)这个函数声明,但你定义的add(int x)是一个同名重载函数(C++允许同名函数通过参数列表区分)。编译器只会检查当前文件内的代码:这个add(int)的定义语法没问题,且当前文件里没有调用add(int, int),所以编译器不会强制要求在这个文件里实现add(int, int),自然不会报错,最终生成math.o。
只有到链接阶段,链接器会把所有目标文件合并,此时发现main.o需要的add(int, int)符号在所有目标文件里都找不到(math.o里只有add(int)的符号),才会抛出未定义符号的错误。
内容的提问来源于stack exchange,提问作者utg.tdawg
相关产品推荐
相关产品推荐

