Могу ли я использовать [[__progmem__]] вместо PROGMEM?

В pgmspace.h PROGMEM определяется как __ATTR_PROGMEM__, который определяется как __attribute__((__progmem__)). AFAIK, __attribute__ предназначен только для GNU. Начиная с C++ 11, у нас есть последовательность спецификаторов атрибутов.

Я не могу использовать [[__progmem__]] вместо PROGMEM. Ошибка

Предупреждение: директива атрибута '__progmem__' игнорируется [-Wattributes]

Разве это не должно работать одинаково?

Зачем мне это делать?

  1. Ясность: Когда я впервые прочитал код, использующий PROGMEM, я подумал, что это имя переменной (поскольку это константа, у нас есть правило, согласно которому оно должно быть в верхнем регистре, что соответствует). Читая дальше, я нашел настоящее имя переменной, которое меня смутило. Помещение его в квадратные скобки сразу же дало бы понять, что это атрибут, а не имя.
  2. Переносимость: [[ ]] является стандартом C++, а __attribute__ – нет.

, 👍-1


1 ответ


0

Может быть, мне стоит просто прочитать всю документацию...

В разделе Стандартные атрибуты мы видим атрибуты, которые входят в стандарт C++. __progmem__ не входит в их число.

По примеру синтаксиса 2 я попробовал [[gnu::__progmem__]], который компилируется. Таким образом, это помогает с Ясностью, но поскольку теперь у него есть пространство имен gnu, это не помогает с Переносимостью.

,

Насчет «это не помогает с _Portability_»: согласно [документации PROGMEM](https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html), «Эти функции представляют собой попытайтесь обеспечить некоторую совместимость с файлами заголовков, поставляемыми с IAR C, чтобы упростить перенос приложений между разными компиляторами». Я сомневаюсь, что PROGMEM может быть более портативным. Сколько компиляторов C (не говоря уже о C++) поддерживают архитектуру AVR? Сколько из них поддерживают сохранение констант во флэш-памяти?, @Edgar Bonet

И макроподход имеет приятный эффект: вы можете предоставить макрос без заменяющего текста для систем, которые не поддерживают такие атрибуты, например, если вы моделируете на ПК., @the busybee