ho una macro per ripetere le macro che uso per riempire gli array con i valori di default in fase di compilazione:C macro espansione ordine
const int array [512] =
{
MACRO_REPEAT(512, -2) // this repeats -2, 512 times
[4] = 10,
[5] = 2,
...
}
La ripetizione macro si espanderà a MACRO_REPEAT_512, ma ora ho voluto usare altre macro come la dimensione della matrice, come:
#define ARRAY_LENGTH 512
const int array [ARRAY_LENGTH ] =
{
MACRO_REPEAT(ARRAY_LENGTH , -2) // this repeats -2, 512 times
[4] = 10,
[5] = 2,
...
}
Ma questo si espande per MACRO_REPEAT_ARRAY_LENGTH, non si espande ARRAY_LENGTH
valore prima concatenazione esso. Altro esempio sarebbe per array multidimensionali, che coinvolge più livelli di espansione:
#define X 512
#define Y 512
const int array [X][Y] =
{
MACRO_REPEAT(X*Y , -2) // this repeats -2, 512 times
[4] = 10,
[5] = 2,
...
}
Questo si espanderà per MARO_REPEAT_X * Y. Quindi, c'è un modo per espandere quei valori al valore numerico finale prima di concatenarlo ad altre macro?
Perché non usare semplicemente un ciclo o 'memset()'? Sì, quelli lavorano in fase di esecuzione, ma ottengono l'effetto desiderato relativamente facilmente. – Peter
GCC ha un'estensione che consente di inizializzare un intervallo di elementi con lo stesso valore, qualcosa come 'int array [ARRAY_LENGTH] = {[0 ... 3] = -2, [4] = 10, [5] = 2, [6 ... ARRAY_LENGTH - 1] = -2,}; ' –
@Peter Lo so, ma sto lavorando in un sistema embedded e vorrei memorizzarlo in flash (domanda aggiornata con qualificatore const) – rnunes