重新定义c ++

时间:2010-05-12 22:51:07

标签: c++ header

包含在c ++中的标题如何工作?我已经在.h文件中实现了类,当两个文件中有#include时,就会出现这个错误:

files.h:14:7: error: redefinition of ‘class abstract_file’
files.h:14:20: error: previous definition of ‘class abstract_file’`

每个班级和枚举多次。 谁能解释一下呢?

6 个答案:

答案 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支持它,所以很可能使用它。