Цитата(_Pasha @ Apr 9 2008, 02:42)

- Нечитабельность при инициализации достаточно большой структуры.
C99 позволяет
Код
typedef struct {
uint8_t a;
int b;
char c;
} cfg_t;
// даже порядок инициализации не важен, всё будет правильно
cfg_t cfg EEMEM = {
.b = -1 ,
.c = '2' ,
.a = 3
};
char arr[5] EEMEM = {
[2] = 'c' ,
[4] = 'e' ,
[0] = 'a' // элементы массива 1 и 3 инициализированы нулями по умолчанию
};
К сожалению, в С++ такого нет.
Цитата(_Pasha @ Apr 9 2008, 02:42)

Макрос, который напрашивается здесь, имеет вид
Код
#define PARAM(_TYPE_ , _NAME_ , _INIT_) #ifdef _IN_MAIN_\
EEMEM _TYPE_ _NAME_ = _INIT_\
#else\
extern EEMEM _TYPE_ _NAME_\
#endif
Нельзя делать проверку условия внутри макроса. И нельзя всё одной строкой. Надо так:
Код
#ifdef _IN_MAIN_
#define PARAM(_TYPE_ , _NAME_ , _INIT_) \
EEMEM _TYPE_ _NAME_ = _INIT_
#else
#define PARAM(_TYPE_ , _NAME_ , _INIT_) extern EEMEM _TYPE_ _NAME_
#endif
Кстати, С99 позволяет это даже не при инициализации делать, можно делать эдакие "литералы"
Код
void foo(cfg_t *p)
{
*p = (cfg_t){ .c = 'c', .b = -1, .a = 0 };
// ну или *p = (cfg_t){ 0, -1, 'c'}; для тех, кто помнит порядок полей;-)
}
вместо
Код
void foo(cfg_t *p)
{
p->c = 'c';
p->b = -1;
p->a = 0;
}
И avr-gcc чудесно такое компилирует, я иногда пользуюсь.
А потом как вспомню, что далеко не все так стандарт поддерживают, как gcc, так и начинаю стараться не привыкать.
Ну и С++ такого не позволяет...
Даже с -std=gnu++98, не говоря уже о -std=c++98 --pedantic