2012-11-14 16 views
13

dato il seguente codice:Come conoscere la dimensione di un array const?

const myStr codesArr[] = {"AA","BB", "CC"};  

myStr è una classe le coperture char*. Ho bisogno di eseguire il loop su tutti gli elementi dell'array ma non conosco il numero di elementi. Non voglio definire un valore const che rappresenterà la dimensione (in questo caso 3)

E 'sicuro usare qualcosa come:

const int size = sizeof(codesArr)/sizeof(myStr); 

cosa fare?

+2

e 'questa domanda C o C++? per C++ Consiglierei davvero l'uso di 'std :: array' (o' std :: tr1 :: array' se il tuo com piler non è C++ 11) invece di array incorporati. E probabilmente usando 'std :: string' invece di qualunque cosa' myStr' fa – Grizzly

+0

Opzionalmente potresti anche fare 'sizeof (codesArr)/sizeof (codesArr [0]);', con la restrizione menzionata da Luchian Grigore. –

risposta

16

È possibile utilizzare int size = sizeof(codesArr)/sizeof(myStr); purché non lo si passi come parametro a una funzione, poiché in tal caso la matrice verrà decaduta in un puntatore e le informazioni sulla dimensione verranno perse.

È possibile anche utilizzare un modello di trucco:

template<typename T, int sz> 
int size(T(&)[sz]) 
{ 
    return sz; 
} 
+0

sizeof restituisce un size_t, ma lo usiamo tutti con int. Funziona a causa del cast implicito? – Maroun

+1

@ Maroun85 Sì, c'è una conversione implicita (non un cast di per sé). Questa conversione non causerà alcun problema finché la dimensione può essere rappresentata come int. – nos

+1

La funzione 'size()' dovrebbe essere 'constexpr' in C++ 11, o usare la tecnica macro in C++ 03, in modo che possa essere usata come espressione costante. – Nawaz

28

Il modo più sicuro e chiaro per farlo è quello di utilizzare std::extent (dal C++ 11):

const size_t size = std::extent<decltype(codesArr)>::value; 
0

Il modo migliore (pre C++ 11) per ottenere la dimensione di un array è data a this link. È un trucco di modello contorto , ma presenta molti vantaggi rispetto ad altri approcci, come illustrato nel link precedente. Il metodo è quello di utilizzare la seguente funzione + macro:

template <typename T, size_t N> 
char (&_ArraySizeHelper(T (&array)[N]))[N]; 

#define countof(array) (sizeof(_ArraySizeHelper(array))) 

suoi vantaggi, tra gli altri, sono che è puramente un'operazione volta compilazione, che è meglio che farlo in fase di esecuzione e, prima C++ 11 di constexpr, è l'unico metodo che consente di utilizzare il risultato dell'operazione come la dimensione di un altro array (sin dalla sua un momento compilazione costante

+0

Cosa c'è di così contorto? È un uso diretto della deduzione degli argomenti del modello. (Se vuoi trucchi di modelli contorti, guarda alcune delle fonti Boost.) –

+3

(Naturalmente, c'è il fatto che il tuo codice esatto ha un comportamento indefinito, poiché contiene un simbolo che inizia con un trattino basso seguito da una lettera maiuscola.) –

Problemi correlati