Quindi, supponiamo che i tuoi due funzioni sono chiamati sizeof_char_array
e sizeof_int_array
.
In C11, v'è una nuova funzionalità denominata "selezione generico" che vi permetterà di fare quello che vuoi con un relativamente semplice macro:
#define sizeof_array(X) \
_Generic (*(X), \
char: sizeof_char_array, \
default: sizeof_int_array) (X)
(non hanno nemmeno un'implementazione C11 per testare questo contro, quindi caveat emptor!)
Prima di C11, questo a volte veniva eseguito con una macro che utilizzava regolarmente funzioni con nome. È possibile definire una macro che chiama una funzione o l'altro a seconda di una macro argomento suggerimento:
#define sizeof_array(xtype, x) sizeof_ ## xtype ##_array(x)
int a[] = { 1, 2, 3, 4, -1 };
char b[] = "abc";
sizeof_array(int, a); /* macro expands to sizeof_int_array(a) */
sizeof_array(char, b); /* macro expands to sizeof_char_array(b) */
Se l'argomento d'ingresso è davvero un array, è possibile utilizzare una macro per calcolare direttamente le sue dimensioni:
#define ARRAY_SZ(x) (sizeof(x)/((void *)x == &x ? sizeof(x[0]) : 0))
nel caso di una matrice, la seguente espressione è vero:
(void *)arr == &arr
poiché l'indirizzo di un array ha la stessa posizione nella memoria, come l'indirizzo del suo primo elemento.
Quindi, la macro calcola: sizeof(arr)/sizeof(arr[0])
. Poiché l'operatore sizeof
riporta la dimensione in byte del suo argomento, l'espressione calcolata determina il numero di elementi nella matrice. Tuttavia, se si sta utilizzando una sentinella per calcolare la lunghezza, la macro ARRAY_SZ
risulterà in una dimensione di almeno una più grande della lunghezza trovata che attraversa la matrice per la sentinella.
Nel caso in cui l'argomento non sia un array, l'espressione restituisce un'eccezione 0 per divisione.
cos'è 'int size'? –
Dimensioni dell'array? Lo chiarirò perché sembra non essere chiaro. – Nobilis
beh se conosce la dimensione dell'array in anticipo, perché userà una funzione super come questa per inferire automaticamente il tipo e chiamare la funzione appropriata per calcolare la lunghezza dell'array? :-) –