2011-10-28 15 views
8

Powiel możliwe:
Is it possible to print out the size of a C++ class at compile-time?Druk sizeof (T) w czasie kompilacji

mogę Wyjście wielkość obiektu w czasie kompilacji? Ponieważ kompilator ma już te informacje podczas kompilowania pliku źródłowego, czy można go (w czasie kompilacji) przetworzyć zamiast długiego procesu wyprowadzania rozmiaru gdzieś w konsoli aplikacji lub w oknie wyjściowym debugowania?

Będzie to bardzo przydatne, szczególnie gdy będę mógł kompilować pliki pojedynczego źródła, co zaoszczędziłoby mi ogromnej ilości czasu podczas pracy nad dużymi projektami.

+0

Czy tego właśnie szukasz? http://stackoverflow.com/questions/2008398/to-it-possible-to-print-out-the-size-of-ac-class-at-compile-time – birryree

+0

Wiele kompilatorów ma '# pragma' lub inne dyrektywa, której można używać do wyprowadzania wartości podczas kompilacji. Musisz sprawdzić dokumentację kompilatora. Niestety nie wiem, jak uzyskać kompilator do oceny wyrażenia, zanim wygeneruje wynik. –

+0

Nie, to inne pytanie. –

Odpowiedz

19

Tak. Możliwy duplikat drukuje rozmiar jako komunikat error, co oznacza, że ​​kompilacja się nie powiedzie.

Jednak moje rozwiązanie drukuje rozmiar jako ostrzeżenie wiadomość, co oznacza, że ​​wydrukuje rozmiar, a kompilacja będzie kontynuowana.

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; 
} 

komunikat ostrzegawczy:

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

Uwaga: wartość n mieści się w ostrzegawczy jest wartość sizeof (int)


Powyższy kod jest poprawiony, a mój pierwszy próba była to:

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

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

komunikat ostrzegawczy:

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

Pomysł pochodzi z mojej poprzedniej odpowiedzi na to pytanie:

+1

Doskonale, dzięki. – Samaursa

Powiązane problemy