Может ли "#pragma once" вызывать ошибки?
Все мои заголовочные файлы используют include guards , а также pragma once:
#pragma once
#ifndef FILE_NAME_H
#define FILE_NAME_H
class foo
{
//foo interface..
};
#endif /* FILE_NAME_H */
Я понимаю, что pragma once не является стандартной и может не совпадать в разных компиляторах, но есть ли вероятность, что это вызовет ошибку? Может быть, лучше как-то проверить, доступен ли он в первую очередь?
#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE
#pragma once
#endif
#ifndef FILE_NAME_H
#define FILE_NAME_H
class foo
{
//foo interface..
};
#endif /* FILE_NAME_H */
Я хочу предоставить pragma once в качестве опции для возможного ускорения компиляции и избежания столкновения имен, обеспечивая при этом совместимость по всему компиляторы.
2 ответа:
Если
Таким образом, идеальный способ-использовать как#pragma once
не поддерживается, то он будет просто проигнорирован[Ref#1], и защита заголовка будет служить вам, поэтому нет ничего плохого в использовании их обоих, вам действительно не нужно проверять поддержку#pragma once
.#pragma once
, так и включать guards, и у вас есть переносимый код, который также может использовать преимущества оптимизации#pragma once
, которые может поддерживать компилятор.
[Ref#1]
Стандартный C++03: 16.6 Pragma ДирективаДиректива предварительной обработки вида
# pragma pp-tokensopt new-line
Заставляет реализацию вести себя определенным образом. любая pragma, которая не распознается реализацией, игнорируется.