2011-10-28 16 views
8

Eventuali duplicati:
Is it possible to print out the size of a C++ class at compile-time?stampa sizeof (T) al momento della compilazione

Posso uscita la dimensione di un oggetto al momento della compilazione? Poiché il compilatore ha già queste informazioni quando sta compilando un file sorgente, posso vedere (al momento della compilazione) piuttosto che passare attraverso il lungo processo di output della dimensione da qualche parte nella console dell'applicazione o nella finestra di output di debug?

Ciò sarà molto utile soprattutto quando sono in grado di compilare file di origine singola che mi consente di risparmiare moltissimo tempo quando lavoro su progetti di grandi dimensioni.

+0

È questo quello che stai cercando? http://stackoverflow.com/questions/2008398/is-it-possible-to-print-out-the-size-of-ac-class-at-compile-time – birryree

+0

Molti compilatori hanno un '# pragma' o altro direttiva che può essere utilizzata per generare valori durante la compilazione. Dovrai controllare la documentazione del tuo compilatore. Sfortunatamente non so come ottenere il compilatore per valutare l'espressione prima che generi l'output. –

+0

No, è una domanda diversa. –

risposta

19

Sì. Il possibile duplicato stampa la dimensione come messaggio di errore, il che significa che la compilazione non avrà esito positivo.

Tuttavia, la mia soluzione stampa il formato avviso messaggio, il che significa che stamperà la dimensione e la compilazione continuerà.

template<int N> 
struct print_size_as_warning 
{ 
    char operator()() { return N + 256; } //deliberately causing overflow 
}; 

int main() { 
     print_size_as_warning<sizeof(int)>()(); 
     return 0; 
} 

messaggio di avviso:

prog.cpp: In member function ‘char print_size_as_warning<N>::operator()() [with int N = 4]’: 
prog.cpp:8: instantiated from here 
prog.cpp:4: warning: overflow in implicit constant conversion 

Demo: http://www.ideone.com/m9eg3

Nota: il valore di N nel messaggio di avviso è il valore di sizeof (int)


Il codice sopra è migliorato uno, e il mio primo tentativo è stato questo:

template<int N> 
struct _{ operator char() { return N+ 256; } }; //always overflow 

int main() { 
     char(_<sizeof(int)>()); 
     return 0; 
} 

messaggio di avviso:

prog.cpp: In member function ‘_<N>::operator char() [with int N = 4]’: 
prog.cpp:5: instantiated from here 
prog.cpp:2: warning: overflow in implicit constant conversion 

Demo: http://www.ideone.com/mhXjU

L'idea è tratto dalla mia precedente risposta a questa domanda:

+1

Eccellente, grazie. – Samaursa

Problemi correlati