Включить Guards vs #pragma один раз

Есть ли какая-то конкретная причина, по которой #pragma Once не используется в коде Arduino? Это только потому, что это малоизвестная функция, или есть какая-то основная причина для использования #ifndef XXX_H/#define XXX_H/#endif?

, 👍7

Обсуждение

Потому что #pragma Once ненадежна и вообще дерьмо. Включите охранников FTW!, @Majenko

Возможно, эта часть исходного кода ядра Arduino старше, чем #pragma Once. Что, кстати, нестандартно. Он был представлен в GCC 3.4., @Mikael Patel

#pragma Once не является стандартной функцией., @AnT

Нестандартно, но чертовски полезно. Было бы разумно подумать о добавлении поддержки для него., @Tom

все #pragma нестандартны по определению. Однако я начал использовать их примерно в 1986 году в различных компиляторах C, и даже тогда они казались довольно повсеместными. Думаю, я удивлен, что это не так в мире C++., @Tim Long


1 ответ


Лучший ответ:

9

#pragma Once работает с абсолютным именем файла. Включите работу охранников над содержимым файла.

Если у вас есть несколько копий одной и той же библиотеки (может быть, в одну библиотеку включены какие-то части другой - такое случается...), #pragma Once не надеется на правильную работу.

Добавьте к этому тот факт, что Arduino IDE копирует некоторые файлы при сборке, и '#pragma Once в значительной степени облажался.

Включить работу охранников в любом случае. Так что разумные люди используют охранники включения и избегают #pragma Once.

,