我一直在阅读标题保护及其用于解决重新定义错误的用法,但我不太确定如何正确实现它。这是我正在尝试做的简化示例:
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头文件,但是每个文件都包含相同的头文件引用,从而给出了重新定义错误。在这种情况下,我不确定如何绕过它或正确实施标题保护。
答案 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
更便携。