基本C ++重新定义错误

时间:2016-02-24 21:20:20

标签: c++

我一直在阅读标题保护及其用于解决重新定义错误的用法,但我不太确定如何正确实现它。这是我正在尝试做的简化示例:

fileA.h

#include first_header.h
#include second_header.h

// code here

fileB.h

#include first_header.h
#include second_header.h

// code here

mainfile.cpp

#include fileA.h
#include fileB.h

// code here

现在问题出现在mainfile.cpp中,因为我需要同时包含fileA.h和fileB.h头文件,但是每个文件都包含相同的头文件引用,从而给出了重新定义错误。在这种情况下,我不确定如何绕过它或正确实施标题保护。

3 个答案:

答案 0 :(得分:2)

<强>逻辑: 检查是否定义了特定的宏,如果未定义宏,则定义它并包含头文件的内容。这样可以防止重复包含标题内容。

像这样:

文件A:

#ifndef fileA_h
#define fileA_h

#include first_header.h
#include second_header.h

//code here

#endif

文件B:

#ifndef fileB_h
#define fileB_h

#include first_header.h
#include second_header.h

//code here

#endif

答案 1 :(得分:2)

首先,您需要在文件名周围加上引号或尖括号,如下所示: #include <fileA.h> 要么 #include "fileA.h"

根据您发布的内容,您似乎并不真正理解标头警卫的工作原理。所以这就是破败。

假设我有一个我希望能够从不同的c ++文件调用的函数。您首先需要一个头文件。 (你可以在你的包含警卫内做包括。)

#ifndef MYHEADER_HPP
#define MYHEADER_HPP

#include "first_header.h"
#include "second_header.h"

void MyFunction();

#endif

非包含预处理器行组成了所谓的&#34; Include Guard,&#34;你应该始终保护你的头文件。

然后在.cpp文件中实现所述函数,如下所示:

#include "MyHeader.hpp"

void MyFunction()
{
    // Implementation goes here
}

现在,您可以在其他代码中使用此功能:

#include "MyHeader.hpp"

int main()
{
    MyFunction();
}

如果您正在使用IDE编译并且为您处理链接,但为了以防万一,您可以使用g ++编译和链接(假设&#34; main.cpp&#34;文件和&#34; MyFunction.cpp&#34;文件):

g++ main.cpp -c
g++ MyFunction.cpp -c
g++ main.o MyFunction.o -o MyExecutable

我希望这有帮助并祝你好运!

答案 2 :(得分:1)

大多数编译器(例如Visual Studio)也支持 #pragma once ,而不是包含表示为&#34; #ifndef&#34;的保护。您将在使用MS Visual C ++编写的一些遗留代码中找到它。

然而,

#ifndef MYHEADER_HPP
#define MYHEADER_HPP

// code here

#endif

更便携。