合并C++头文件后函数调用出现未声明错误的原因咨询
原结构下无问题的原因
之前拆分a.hpp和b.hpp时,c.hpp应该是直接或间接包含了a.hpp,且randomUnitVector的声明/定义在c.hpp使用该函数之前就被编译器读取到了——比如c.hpp开头就#include "a.hpp",编译器处理到c.hpp里的函数调用时,已经见过这个函数的完整声明,自然不会报错。合并后报错的核心原因
合并成Utility.hpp后,你大概率是把原b.hpp的内容放在了原a.hpp内容的前面。当c.hpp包含Utility.hpp时,编译器会按顺序处理头文件内容:先处理原b.hpp的代码,此时randomUnitVector的声明还没被读到,但c.hpp里已经在使用这个函数了,所以编译器抛出“未声明”的错误。而main.cpp里调用正常,是因为main.cpp中调用函数的位置在Utility.hpp全部内容被处理之后,编译器已经读到了函数声明。前置声明能解决问题的逻辑
手动添加glm::vec3 randomUnitVector();前置声明,相当于提前给编译器打了招呼:“存在一个返回glm::vec3、无参数的randomUnitVector函数”,不管Utility.hpp里的内容顺序如何,编译器在处理c.hpp的函数调用时,已经知道函数的签名,就不会再报错。更彻底的解决方式
调整Utility.hpp里的内容顺序,把原a.hpp中包含randomUnitVector的部分放在原b.hpp内容的前面。这样c.hpp包含Utility.hpp后,编译器会先读到函数声明,后续使用时就不会出现未声明的问题,也不需要额外加前置声明。
内容的提问来源于stack exchange,提问作者Yiğit Çatak

