包含在c ++中的标题如何工作?我已经在.h文件中实现了类,当两个文件中有#include
时,就会出现这个错误:
files.h:14:7: error: redefinition of ‘class abstract_file’
files.h:14:20: error: previous definition of ‘class abstract_file’`
每个班级和枚举多次。 谁能解释一下呢?
答案 0 :(得分:6)
您只能包含一次定义,但可以多次包含标题。要解决此问题,请添加:
#pragma once
到每个头文件的顶部。
虽然#pragma once
比较常见,但如果您使用的是较旧的编译器,则可能不受支持。在这种情况下,您需要回到手动包含警戒:
#ifndef MY_HEADER_H
#define MY_HEADER_H
...
#endif
(请注意,您需要将MY_HEADER_H
替换为每个头文件的唯一字符串)
答案 1 :(得分:6)
在C ++中使用include
只需要包含文件,并将内容splats到包含它的位置。要执行此操作而不必担心同一文件的多个包含,您需要使用标头保护。对所有头文件使用此基本格式:
#ifndef FILENAME_H
#define FILENAME_H
class foo (or whatever else is in the file!) {
...
};
#endif
答案 2 :(得分:2)
头文件通常定义一个唯一的符号,以便它们只被包含一次。
e.g。
#ifndef _myheader_h
#define _myheader_h
// rest of header goes here
#endif
一些编译器支持
#pragma once
请参阅维基百科上的Pragma Once。
答案 3 :(得分:2)
虽然许多人已经为您解决了您的错误,但似乎没有人回答您的初步问题:
包含在c ++中的标题如何工作?
当预处理器找到#include
指令时,它会用指定文件的整个内容替换它。
您可以在cplusplus.com上阅读有关预处理程序指令的更多信息。
更新:为了说明这一点,如果您有gcc
方便,可以尝试以下操作:
echo '#include <iostream>' > test.cxx
gcc -E test.cxx
当预处理的源代码被发送到标准输出时,您会看到iostream
突然出现在你眼前的对象。
答案 4 :(得分:0)
你可以做的是保护你的标题不受多种内容的影响:
#ifndef MY_HEADER__
#define MY_HEADER__
/* your stuff goes here! */
#endif
您也可以使用:
#pragma once
但它不是标准的,尽管许多编译器都支持它。
答案 5 :(得分:0)
在头文件中使用包含警戒:
#ifndef FILES_H
#define FILES_H
struct foo {
int member;
};
#endif // FILES_H
这可以确保您的标题只会包含一次。
另一种方法是在头文件中使用#pragma once
,但它不是标准C.但Visual C,GCC和Clang支持它,所以很可能使用它。