Может ли "#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 5

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, которая не распознается реализацией, игнорируется.

Стандарт гласит: "Любая pragma, которая не распознана реализацией, игнорируется.", так что вы, вероятно, в порядке, даже если компилятор не знает #pragma один раз.