Включить Guards vs #pragma один раз
Есть ли какая-то конкретная причина, по которой #pragma Once
не используется в коде Arduino? Это только потому, что это малоизвестная функция, или есть какая-то основная причина для использования #ifndef XXX_H
/#define XXX_H
/#endif
?
@Tim Long, 👍7
Обсуждение1 ответ
Лучший ответ:
#pragma Once
работает с абсолютным именем файла. Включите работу охранников над содержимым файла.
Если у вас есть несколько копий одной и той же библиотеки (может быть, в одну библиотеку включены какие-то части другой - такое случается...), #pragma Once
не надеется на правильную работу.
Добавьте к этому тот факт, что Arduino IDE копирует некоторые файлы при сборке, и '#pragma Once
в значительной степени облажался.
Включить работу охранников в любом случае. Так что разумные люди используют охранники включения и избегают #pragma Once
.
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Глобальные переменные занимают много места в динамической памяти.
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Как определить, было ли нажато более одной кнопки
- Альтернативы дисплею Nextion
- Двоичный форматировщик сообщений
- Считается ли #ifdef __SD_H__ плохой практикой?
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
Потому что
#pragma Once
ненадежна и вообще дерьмо. Включите охранников FTW!, @MajenkoВозможно, эта часть исходного кода ядра Arduino старше, чем
#pragma Once
. Что, кстати, нестандартно. Он был представлен в GCC 3.4., @Mikael Patel#pragma Once
не является стандартной функцией., @AnTНестандартно, но чертовски полезно. Было бы разумно подумать о добавлении поддержки для него., @Tom
все #pragma нестандартны по определению. Однако я начал использовать их примерно в 1986 году в различных компиляторах C, и даже тогда они казались довольно повсеместными. Думаю, я удивлен, что это не так в мире C++., @Tim Long