头文件包含循环和多重定义
header file include-loop and multiple definition
我有一个包含函数的util.h
,该函数将在a.h
和'b.h'中使用,此外,a.h
和b.h
将相互包含,以便访问彼此定义的一些类。
//util.h
#ifndef _UTIL_H_
#define _UTIL_H_
#include <iostream>
void foo()
{
std::cout << "foon";
}
#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
我的问题是,我foo
multiple definition
错误.如何?
我认为问题可能是,a.h
包括util.h
和b.h
,而b.h
再次包含util.h
,所以我得到了多个定义错误。但这似乎没有意义,因为在util.h
我写了#ifndef/#define
警卫。
任何人都可以给我帮助,谢谢。
您的问题是由定义而不是简单地在utils.h
中声明foo
引起的
对于此示例,假设我们有:
答.cpp
#include "a.h"
乙.cpp
#include "b.h"
主.cpp
#include "a.h"
#include "b.h"
#include "utils.h"
int main(){
foo();
return 0;
}
经过预处理,但在编译之前,您的文件现在看起来像这样(这是一种简化,但您明白了):
答.cpp
void foo()
{
std::cout << "foon";
}
乙.cpp
void foo()
{
std::cout << "foon";
}
主.cpp
void foo()
{
std::cout << "foon";
}
int main(){
foo();
return 0;
}
现在当你编译时,你有 3 个foo
定义(它们都是相同的,但这无关紧要)。编译后,链接器无法知道为任何给定的foo
调用选取哪个定义,因此会生成错误。
不要在标头中定义foo
,而是在 utils.cpp
中定义它,并且只在 utils.h
中放置一个声明,例如
实用性.h
#ifndef _UTIL_H_
#define _UTIL_H_
void foo();
#endif
或者,将foo
声明为 static
或 inline
:
实用性.h
#ifndef _UTIL_H_
#define _UTIL_H_
static void foo()
{
std::cout << "foon";
}
/* OR */
inline void foo()
{
std::cout << "foon";
}
#endif
仅当您要内联函数时,才需要执行此操作。在这种情况下,编译器需要在使用它的每个翻译单元中定义函数,因为它本质上变成了一个编译时宏。
相关文章:
- 在定义字符数组(井字游戏)的 for 循环中应用输入限制
- 在C++中循环访问自定义结构列表的小问题
- 具有迭代器和自定义步长的循环结束条件
- 在 for 循环中定义的临时数组,并分配给属于指针数组的指针
- 循环访问自定义双链表
- 需要帮助定义循环控制变量(while loops)C++
- C++11:没有复制构造函数的自定义基于范围的循环
- c++在循环中定义一组概率分布
- 如何在已定义的名称模式上循环
- C++未定义的行为unordered_map为基于范围的 for 循环中的右值
- 循环依赖结构,使用前向声明时结构的错误重定义
- For 和 while 循环在全局定义的函数中不起作用
- 如何在C++中循环浏览自定义列表
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 自定义对象构造函数在循环外部循环
- 带有自定义对象的C 范围循环
- 为什么 for 循环不能定义两个作用域的变量?
- 在主循环外部多个文件上定义全局变量
- 在运行时定义循环
- 使用预处理器重新定义循环