Могу ли я использовать [[__progmem__]] вместо PROGMEM?
В pgmspace.h
PROGMEM
определяется как __ATTR_PROGMEM__
, который определяется как __attribute__((__progmem__))
. AFAIK, __attribute__
предназначен только для GNU. Начиная с C++ 11, у нас есть последовательность спецификаторов атрибутов.
Я не могу использовать [[__progmem__]]
вместо PROGMEM
. Ошибка
Предупреждение: директива атрибута '__progmem__' игнорируется [-Wattributes]
Разве это не должно работать одинаково?
Зачем мне это делать?
- Ясность: Когда я впервые прочитал код, использующий PROGMEM, я подумал, что это имя переменной (поскольку это константа, у нас есть правило, согласно которому оно должно быть в верхнем регистре, что соответствует). Читая дальше, я нашел настоящее имя переменной, которое меня смутило. Помещение его в квадратные скобки сразу же дало бы понять, что это атрибут, а не имя.
- Переносимость:
[[ ]]
является стандартом C++, а__attribute__
– нет.
@Thomas Weller, 👍-1
1 ответ
Может быть, мне стоит просто прочитать всю документацию...
В разделе Стандартные атрибуты мы видим атрибуты, которые входят в стандарт C++. __progmem__
не входит в их число.
По примеру синтаксиса 2 я попробовал [[gnu::__progmem__]]
, который компилируется. Таким образом, это помогает с Ясностью, но поскольку теперь у него есть пространство имен gnu
, это не помогает с Переносимостью.
- Записать во флэш-память с помощью PROGMEM
- Преимущества глобальных переменных перед статическими членами класса?
- Ошибка компиляции ESP8266: "previous declaration of 'HTTPMethod HTTP_HEAD'"
- Вспомогательный объект Flash String в качестве переменной
- Arduino IDE: как получить длину PROGMEM const?
- Использование программной памяти в ESP8266 по сравнению с AVR, а также как обрабатывать большие динамические строки
- Проблема с памятью Arduino со старыми чипами дисплея HP HDSP-2000
- Как использовать PROGMEM в файле .h/.cpp вместо файла .ino?
Насчет «это не помогает с _Portability_»: согласно [документации
PROGMEM
](https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html), «Эти функции представляют собой попытайтесь обеспечить некоторую совместимость с файлами заголовков, поставляемыми с IAR C, чтобы упростить перенос приложений между разными компиляторами». Я сомневаюсь, что PROGMEM может быть более портативным. Сколько компиляторов C (не говоря уже о C++) поддерживают архитектуру AVR? Сколько из них поддерживают сохранение констант во флэш-памяти?, @Edgar BonetИ макроподход имеет приятный эффект: вы можете предоставить макрос без заменяющего текста для систем, которые не поддерживают такие атрибуты, например, если вы моделируете на ПК., @the busybee