刚刚面试完一家大厂,面试官看起来很年轻,在问我问题的时候问到了头文件包含的问题,描述是这样的。
有一个头文件c.h,c中包含一个help函数,两个cpp文件a.cpp b.cpp,它们都包含c.h,请问这样会报错吗?
我是会报重复定义的问题,用#ifndef 或者 #pargma once 来解决。
他说,你这样不能解决不了重复的问题,因为a、b在链接的时候都有c这个help函数,这会涉及到重名导致链接出错。
解决方案是把help函数的实现和定义分离,用c.cpp去实现help函数就没有问题了。
当时我觉得涉及到我的知识盲区了,也没有杠。
结果我下去实验了一下,发现#ifndef 或者 #pargma once 确实可以解决这个问题。
但是面试官又没说a、b不同模块的前提条件。
请问各位大大这个问题是面试官描述错了吗?
请问各位大大这个问题是面试官描述错了吗?
链接是否会出现类似的问题,正确的描述是什么呢?
下列为Clion环境下的几个文件,实测编译通过,运行正确。
// c.h #pragma once int help() { return 1; }
// a.cpp #include "c.h" int helpa() { return help(); }
// b.cpp #include "c.h" int helpb(){ return help(); }
// main.cpp #include "a.cpp" #include "b.cpp" #include "iostream" int main() { std::cout << helpa(); std::cout << helpb(); std::cout << help(); return 0; }
我的问题已讨论解决。
之前我的预设是只编译连接main.cpp这一个文件,面试官的场景是a.cpp b.cpp这两个文件要一并编译,所以产生了理解层面的偏差,如果编译main.cpp+a.cpp+b.cpp并链接用progma once是回避不了重复定义的问题的,但是可以通过实现和定义分离的方式来避免,因为c++ 的可多次声明仅一次定义的特性。
总的来说还是自己实践太少,没有遇到此类问题并思考的经验。
全部评论
(2) 回帖