gpt4 book ai didi

c++ - 头文件包含循环和多重定义

转载 作者:太空宇宙 更新时间:2023-11-04 15:48:58 25 4
gpt4 key购买 nike

我有一个 util.h 包含一个将在 a.h 和 'b.h' 中使用的函数,此外,a.hb.h 将相互包含,以便访问彼此定义的一些类。

//util.h

#ifndef _UTIL_H_
#define _UTIL_H_

#include <iostream>

void foo()
{
std::cout << "foo\n";
}

#endif

//a.h, it has a a.cpp
#ifndef _A_H_
#define _A_H_

#include "util.h"
#include "b.h"

//some classes' definition

#endif

//b.h, it has a b.cpp
#ifndef _B_H_
#define _B_H_

#include "util.h"
#include "a.h"

//some classes' definition

#endif

我的问题是,我遇到了 foomultiple definition 错误。怎么办?

我认为问题可能在于,a.h 包括 util.hb.h,而 b.h 包括util.h 再次出现,所以我遇到了多个 def 错误。但是好像说不通,因为在util.h里面我写了#ifndef/#define守卫。

任何人都可以给我帮助,谢谢。

最佳答案

您的问题是由 定义 而不是简单地 声明 utils.h 中的 foo 引起的

对于这个例子,假设我们有:

a.cpp

#include "a.h"

b.cpp

#include "b.h"

main.cpp

#include "a.h"
#include "b.h"
#include "utils.h"


int main(){
foo();
return 0;
}

在预处理之后,但在编译之前,您的文件现在看起来像这样(这是一种简化,但您明白了):

a.cpp

void foo()
{
std::cout << "foo\n";
}

b.cpp

void foo()
{
std::cout << "foo\n";
}

main.cpp

void foo()
{
std::cout << "foo\n";
}

int main(){
foo();
return 0;
}

现在当你编译时,你有 3 个 foo 的定义(它们都是相同的,但这无关紧要)。编译后,链接器无法知道为任何给定的 foo 调用选择哪个定义,因此它会产生错误。

与其在 header 中定义 foo,不如在 utils.cpp 中定义它,并且只在 utils.h 中声明,例如

utils.h

#ifndef _UTIL_H_
#define _UTIL_H_

void foo();

#endif

或者,也可以将 foo 声明为 staticinline:

utils.h

#ifndef _UTIL_H_
#define _UTIL_H_

static void foo()
{
std::cout << "foo\n";
}

/* OR */

inline void foo()
{
std::cout << "foo\n";
}


#endif

只有当你想 inline 时才需要做这件事你的功能。在这种情况下,编译器需要在使用它的每个翻译单元中定义函数,因为它本质上变成了编译时宏。

关于c++ - 头文件包含循环和多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11876434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com