首页 > 大厂面试疑惑:是面试官错了吗?
头像
大黑熊
编辑于 2020-09-30 16:09
+ 关注

大厂面试疑惑:是面试官错了吗?

刚刚面试完一家大厂,面试官看起来很年轻,在问我问题的时候问到了头文件包含的问题,描述是这样的。
有一个头文件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) 回帖
加载中...
话题 回帖

相关热帖

近期精华帖

热门推荐