Какие-нибудь инструменты для поиска дубликатов #include? - PullRequest
3 голосов
/ 17 марта 2012

это звучит странно, но, может быть, есть такой ... Я гуглил, но ничего не нашел.
простой пример:
у меня есть один файл class1.h:

#include "a.h"
#include "b.h"

другой файл class2.h:

#include "a.h"
#include "c.h"

и main.cpp:

#include "class2.h" //as we see here, we getting "a.h" double included by class1.h and class2.h

Я хочу избавиться от таких парней в моем проекте.

конечно, в примере это не так сложно, но у меня есть огромное количество файлов, которые включают друг друга во многих отношениях и трудно отследить все дубли самостоятельно.

какие-либо предложения, прежде чем я собираюсь написать этот инструмент самостоятельно? :)

Ответы [ 4 ]

6 голосов
/ 17 марта 2012

Как я вижу, если код в файле основан на других вещах, которые должны быть объявлены, он должен включать файл, содержащий эти объявления. В противном случае, материал становится хрупким и включает в себя все время и в определенном порядке, и все становится безобразным. Так что для меня «дубликаты включают» - хорошая вещь; каждый фрагмент кода может позаботиться о своих собственных зависимостях с меньшими хлопотами.

Что касается того, как не допустить взлома дубликатов включенных ... есть идиома под названием "включить охрану". Они выглядят примерно так ...

(file1.h)

#ifndef FILE1_H
#define FILE1_H

(the meat of file1.h goes in here)

#endif

Когда этот файл включается в первый раз, FILE1_H еще не определен (или не должен быть, если вы выберете более подходящие имена для своих файлов, чем этот), поэтому код будет включен (и FILE1_H впоследствии определяется). Однако в следующий раз, когда он будет включен, FILE1_H теперь определен, поэтому код пропускается.

(Кстати, для этого подойдет любое имя макроса, если оно уникально для каждого файла. Но именно это ограничение является основной причиной, по которой имя макроса почти всегда основано на имени файла.)

На большинстве компиляторов #pragma once также работает. Но это не стандартно; если вы хотите использовать любой компилятор, какой захотите, не используйте его (и не используйте в дополнение к включенному охраннику).

2 голосов
/ 17 марта 2012

Вы должны использовать Включить охрану , чтобы Вы не включали один и тот же заголовок несколько раз в одну единицу перевода .

После того, как вы установили охрану «Включить», вам не нужно беспокоиться о включении заголовочных файлов несколько раз.Хорошей практикой является то, что каждый исходный или заголовочный файл должен включать заголовочные файлы, необходимые для независимой компиляции, то есть: не должен полагаться на включения через другие включенные файлы.

1 голос
/ 17 марта 2012

Кроме того, что сказал @Als, начните использовать предварительные объявления.

0 голосов
/ 17 марта 2012

Я широко использовал #pragma once с моими проектами на С ++, но, как я слышал, это может работать не для всех компиляторов, но если вы используете Microsoft Visual Studio, это работает (я использовал его в VC ++ 6.0, 2005 и 2010)

...