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

刚刚面试完一家大厂,面试官看起来很年轻,在问我问题的时候问到了头文件包含的问题,描述是这样的。
有一个头文件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++ 的可多次声明仅一次定义的特性。

总的来说还是自己实践太少,没有遇到此类问题并思考的经验。

#面试##秋招##C/C++##面试题目#
全部评论
include不是原地展开吗,pragma once只是保证在本文件里不重复吧,所以我站面试官这边😂
1 回复 分享
发布于 2020-09-30 11:35
想起遇到的菜鸡面试官,给她争了半天算法,最后让我反问,我说你下去把那个好好查一下,肯定是你错了,然后给我挂了啊哈哈哈😄
点赞 回复 分享
发布于 2020-10-02 17:48

相关推荐

头像
09-29 16:18
门头沟学院 Java
点赞 评论 收藏
分享
jack_miller:杜:你不用我那你就用我的美赞臣
点赞 评论 收藏
分享
1 3 评论
分享
牛客网
牛客企业服务