2011-10-28 8 views
8

Duplicar posibles:
Is it possible to print out the size of a C++ class at compile-time?impresión sizeof (T) en tiempo de compilación

¿Puedo emitir el tamaño de un objeto en tiempo de compilación? Como el compilador ya tiene esta información cuando está compilando un archivo fuente, ¿puedo ver (en tiempo de compilación) en lugar de pasar por el largo proceso de generar el tamaño en algún lugar de la consola de mi aplicación o la ventana de salida de depuración?

Esto será muy útil, especialmente cuando puedo compilar archivos fuente individuales, lo que me ahorra una enorme cantidad de tiempo cuando trabajo en proyectos grandes.

+0

¿Es esto lo que estás buscando? http://stackoverflow.com/questions/2008398/is-it-possible-to-print-out-the-size-of-ac-class-at-compile-time – birryree

+0

Muchos compiladores tienen un '# pragma' u otro directiva que puede usarse para generar valores durante la compilación. Deberá verificar la documentación de su compilador. Lamentablemente, no sé cómo hacer para que el compilador evalúe la expresión antes de que genere el resultado. –

+0

No, es una pregunta diferente. –

Respuesta

19

Sí. El posible duplicado imprime el tamaño como mensaje de error, lo que significa que la compilación no tendrá éxito.

Sin embargo, mi solución imprime el tamaño como advertencia mensaje de advertencia, lo que significa que imprimirá el tamaño y la compilación continuará.

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

mensaje de advertencia:

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 

Demostración: http://www.ideone.com/m9eg3

Nota: el valor de N en el mensaje de aviso es el valor de sizeof (int)


El código anterior es uno mejorado, y mi primer intento fue la siguiente:

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

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

mensaje Advertencia:

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 

Demostración: http://www.ideone.com/mhXjU

La idea está tomada de mi anterior respuesta a esta pregunta:

+1

Excelente, gracias. – Samaursa

Cuestiones relacionadas