Цитата(Сергей Борщ @ Jan 26 2013, 21:36)

Но только в Си, в плюсах этого нет и, по всей видимости, не будет.
Что меня очень удручает…
Ну да, это из С-шного стандарта, как бы к C++ отношения не имеет. Но в режиме gnu++ могли бы и сделать.
p.s. А const и при PROGMEM правильно писать (неправильно не писать).
Цитата(sherr @ Jan 26 2013, 16:56)

PROGMEM достаточно указывать const (как у GCC ARM)
Это
невозможно в принципе.
Точнее, возможно только в случае, если
все указатели в языке будут «универсальные», хранящие где-то в старших битах признак ОЗУ/флеш и при любом обращении будет идти проверка тех битов, условный переход на LD/LPM.
Я лично не такое не согласен :-)
Чтобы это понять, достаточно знать, что в C означает квалификатор const.
Смотрите:
Код
char const *p; // Указатель на char, который мы не имеем права менять
char const cc; // char, который мы не имеем права менять
char cn; // char, который мы имеем право менять
…
p = &cc; // ну тут понятно
if (*p == 'a') …
p = &cn;
// дальше мы просто не сможем поменять значение cn, пользуясь указателем p,
// но мы должны иметь возможность прочитать cn
if (*p == 'b') …
А вот представьте себе, что
char const cc; затолкало
cc во флеш и обращение по указателю
char const *p; считывает флеш. В результате после
p = &cn; ничего не заработает. А должно работать, так как и то, и то — данные.
Помещение const-объектов для архитектур с единым адресным пространством в ПЗУ — это просто такая оптимизация расходов ОЗУ, ничего не меняющая в работе кода. Те же самые команды так же работают. В функцию
puts(char const *str); мы можем передать как константную, так и неконстантную строку и все будет работать. Она даже не будет знать, что ей передали не константную строку, просто она обещает относиться к ней как константной и всё.
При разных адресных пространствах, как у AVR, такое помещение изменит ситуацию кардинально.