Вопрос по c++ – Несколько включений заголовочных файлов [дубликаты]

0

На этот вопрос уже есть ответ здесь:

Заголовок охранников в C ++ 5 ответов

я имеюA.cpp а такжеB.cpp которые оба включают заголовочный файл.header.h

Позже обаA.cpp а такжеB.cpp включены в.main.cpp

Это вызывает ошибку, когдаmain.cpp компилируется, говоря, что заголовочный файлheader.h был включен дважды.

Как это решить?

@KillianDS Я знаю. Позже я планирую переместить исходный код в файлы cpp и включить определения классов в отдельный заголовочный файл. Chani
Не ждите 'до позже Richard Pump
Не проблема, но ты не должент включает.cpp файлы. KillianDS
Гугл на сроквключить охрану ". Johan Råde
уже поменял :) Chani

Ваш Ответ

3   ответа
2

чтобы включить защиту, есть 3 возможных решения (отсортированные от лучших к худшим):

1 Не используйте этот мусор.

2 Используйте обертку my_header.h

#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <header.h>
#endif // MY_HEADER_H
</header.h>

включите my_header.h вместо header.h в ваш код

3 Используйте охрану в файле .cpp

 #ifndef HEADER_H  
 #define HEADER_H  
 #include <header.h>  
 #endif // HEADER_H
</header.h>

Вы должны быть последовательными и использовать одни и те же охранники везде (этопочему это решение 3)

2

использованиевключать охранников, в ваших заголовках, например:

// Header.h
#ifndef HEADER_H_
#define HEADER_H_

// code from original header.h

#endif

И не надот включает.cpp файлы в другом.cpp файлы. Включите только необходимые заголовки.

редактировать Если заголовочные файлы поступают из сторонней библиотеки и не содержат защитных элементов, я бы очень подозревал эту библиотеку. Я бы бросил это. Однако вы можете создать свои собственные заголовки, включая заголовок библиотеки в include guard:

// FixedHeader.h
#ifndef HEADER_H_
#define HEADER_H_

#include "header.h"

#endif

затем#include "FixedHeader.h", Но я бы бросил библиотеку, серьезно.

@RitwikG, если они из библиотеки, у них уже должны быть охранники. Если они нет, затем бросьте библиотеку, это не хорошо! Хотя обратите внимание, что, по крайней мере, в Windows, включить охрану можно выразить с помощью#pragma once или что-то типа того. juanchopanza
Заголовочные файлы из библиотеки. Так что я не могу добавить охрану заголовка там. Что мне теперь делать? Chani
4

Вы должны окружить свои заголовочные файлы в

#ifndef MYFILE_H
#define MYFILE_H

// Contents of your file

#endif

Их называют включенными охранниками.

Второй момент: ты не долженне включать файлы .cpp, только файлы .h.

Заголовочные файлы не обязательно имеют расширения .h, поэтому, пожалуйста, измените ваше предложение, это может запутать некоторых начинающих программистов. Slava
Заголовочные файлы из библиотеки. Так что я не могу добавить охрану заголовка там. Что мне теперь делать? Chani
@RitwikG Это звучит как "библиотека" сильно сломан. Мой совет: бросьте этот кусок дерьма и используйте то, что на самом деле можно назвать библиотекой. R. Martinho Fernandes

Похожие вопросы