2015-10-09 9 views
1

Я привык делать заявления вперед классов, как это:Избегайте перепечатки. Это хорошая практика? Это необходимо?

// file 1 
#ifndef A_HPP 
#define A_HPP 

class A 
{ 
    ... 
}; 

#endif 

// file 2 
#ifndef B_HPP 
#define B_HPP 

#ifndef A_HPP 
class A; 
#endif 

class B 
{ 

}; 

#endif 

Как вы можете видеть в file 2, я стараюсь безопасно вперед декларацию A. Таким образом, не должно быть возможности обновить A.

Я видел много кода, в котором они не кладут охранников на передние объявления.

Я хотел знать, действительно ли то, что я делаю, или добавляет какую-то безопасность. Может ли какой-либо из этих подходов лучше использовать время компиляции, чем другое? Какой из них вы бы использовали? Зачем?

+0

Я не вижу смысла, если нет циркулярных ссылок; просто замените '#ifndef A_HPP ... # endif' на' #include "a.hpp". Любой вид времени компиляции может быть незначительным. –

ответ

3

Вы НЕ добавляете никакой безопасности. Объявления в C++ могут повторяться в любое время, если они все согласованы.

Кроме того, это не очень хорошая практика. Я никогда не видел, чтобы кто-то так делал. Подумайте, что произойдет, если вы переместите определение A с a.hpp: вы должны изменить все защитные рамки вокруг A в декларации во всех файлах. Жизнь уже достаточно сложная.

+0

Как насчет времени для компиляции. Не потребовалось бы время, чтобы гарантировать, что декларации являются последовательными? – user1754322

+0

Я не думаю, что это добавляет столько времени, сколько стоит заботиться. Кстати, не будет ли ваш чек увеличить время компиляции? –

+0

Я не знаю. Спасибо за краткий ответ. – user1754322

2

Вам не нужно использовать защитник marco, поскольку компилятор будет знать, как обрабатывать оба файла.

Нет необходимости вне последующих 3-х линий в file2.h

#ifndef A_HPP 
class A; 
#endif 

использовать следующую строку уже не является достаточно

#include "file1.h" 

хорошо Концепция прямого заявления

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

В то время, компилятор будет знать:

1) Хорошо, есть класс с именем, как «А», я буду помнить его.

2) Я не знаю его размеров и деталей. Но если кодер использует только A * (указатель A), это нормально, и мне не нужно знать деталь A.

Передовая декларация полезна. Особенно классы взаимосвязаны.

Но если имя типа A не синхронизировано между обоими файлами. g ++ не скомпилируется.


время компиляции

вперед декларация также хорошо использовать, как это сэкономить время компиляции.

Если файл не изменяется, g ++ не будет повторно скомпилироваться.

В то время как файл 2 использует только форвардное объявление, поэтому независимо от того, как вы изменяете файл 1 или класс A, файл 2 не будет компилироваться снова.

Смежные вопросы