Заголовок должен быть включен один раз - PullRequest
2 голосов
/ 25 мая 2011

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

1.

#ifndef SOME_CLASS
#define SOME_CLASS
//code ...
#endif

2.

#ifndef SOME_CLASS
//code...
#define SOME_CLASS
#endif

Что предпочтительнее и почему?

Ответы [ 5 ]

11 голосов
/ 25 мая 2011

Я предпочитаю первый метод, потому что не имеет значения, что происходит после ifndef, потому что он будет определен сразу после.

4 голосов
/ 25 мая 2011

Первый вариант обычно оптимизируется компиляторами так, чтобы он вел себя как нестандартный #pragma once.

Это также более безопасно в случае рекурсивных включений.Если в части //code... вы включите другой заголовок, который включает .... который включает в себя заголовок, который вы редактируете в настоящее время, то вторая версия не будет работать.

2 голосов
/ 25 мая 2011

Я бы выбрал первый.

Причина: если вы когда-нибудь захотите изменить имя охранника (скажем, от SOME_CLASS до SOMECLASS), вам не нужно прокручивать всевплоть до конца файла, чтобы изменить его тоже.

1 голос
/ 25 мая 2011

Лучший вариант - использовать #pragma once#define вы должны быть очень осторожны при использовании нескольких библиотек, поскольку имя охранника может быть не уникальным.

0 голосов
/ 25 мая 2011

Я предпочитаю первый вариант.Предположим, вы включили больше файлов, и эти файлы, в свою очередь, включают файл, содержащий #ifndef SOME_CLASS.

Я думаю, что довольно легко обнаружить ошибки, если #define SOME_CLASS не соседствует с #ifndef SOME_CLASS.

// SomeClass.h
#ifndef SOME_CLASS
#include "OtherFile.h" // will eventually lead to #include "SomeClass.h"
#define SOME_CLASS

... boat load of code here...

#endif // SOME_CLASS
...