Вот так: typedef struct {
void (*pfunc)(void);
char *name;
} state_t;
#define STATE(code,name) [code] = { do_##code, name }
enum { stop, jump, left, right, total_states};
void do_stop();
void do_left();
void do_right();
state_t array[total_states] = { // размер указать, чтобы занулило неинициализированные в конце
STATE(left, "Go left"),
STATE(right, "Go right"),
STATE(stop, "Stop here"),
};
avr-gcc -O2 -S -std=c99
.global array
.data
.LC0:
.string "Stop here"
.LC1:
.string "Go left"
.LC2:
.string "Go right"
.type array, @object
.size array, 16
array:
.word gs(do_stop)
.word .LC0
.skip 4,0 ; это пропущено нулями отсутствующую запись для do_jump
.word gs(do_left)
.word .LC1
.word gs(do_right)
.word .LC2
Ну сам массив правильно бы const объявить и в структуре const char *name.
Но именно для AVR тут строки всё равно в ОЗУ выходят, avr-gcc их тут просот так не затолкает во флеш. только через промежуточные имена.
cog-ом же всё что угодно намутить можно.