2011-04-25 22 views
6

Visual C++ tiene #pragma message que outputs a string into compiler output. Ahora tengo una fábrica:..¿Cómo obtengo una constante numérica en tiempo de compilación durante la compilación en Visual C++?

template<class Type> 
CComPtr<Type> CreateComObject() 
{ 
    CComPtr<Type> newObject(new CComObject<Type>); 
    //do some tuning to the object 
    return newObject; 
} 

y quiero dar salida al tamaño de la clase que se pasa a new (es decir, sizeof(CComObject<Type>) a la salida del compilador Parece que #pragma message sólo acepta cadenas

Cómo puedo salida ? un tiempo de compilación constante numérica

Respuesta

6

Si he entendido bien su pregunta, entonces creo que se puede hacer esto:

template<size_t size> 
struct overflow{ operator char() { return size + 256; } }; //always overflow 
//if you doubt, you can use UCHAR_MAX +1 instead of 256, to ensure overflow. 

template<class Type> 
CComPtr<Type> CreateComObject() 
{ 
    CComPtr<Type> newObject(new CComObject<Type>); 
    char(overflow<sizeof(CComObject<Type>)>()); 
    return newObject; 
} 

El valor de sizeof(CComObject<Type>) se imprimirá como mensajes de advertencia durante la compilación.


Ver esta pequeña demostración: http://www.ideone.com/Diiqy

mirada a estos mensajes (desde el enlace de arriba):

prog.cpp: En función miembro 'Char desbordamiento :: operador() [con unsigned tamaño int = 4u] ':
prog.cpp: En función miembro desbordamiento cha operador :: r() [con unsigned int size = 12u] ':
prog.cpp: En función miembro 'Char desbordamiento :: operador() [con unsigned tamaño int = 400U]':

En Visual Studio, puede ver estos mensajes en la pestaña Generar salida; es posible que no aparezca en Lista de errores> Advertencias ficha.


La idea está tomada de mi otra solución:

Calculating and printing factorial at compile time in C++

+1

@Nawaz, 1 buena respuesta, pero va a dar a la compilación de advertencia consistente para todos los compiladores? (¿no puede ser un mensaje de error o ignorado para cualquier otro compilador?) – iammilind

+0

@iammilind: Dado que el desbordamiento está garantizado, todas las compilaciones decentes generarán estos mensajes de advertencia (en mi opinión). – Nawaz

+0

No necesita desbordamiento, si 'char' tiene más de ocho bits. Y ni gcc ni el compilador en línea de Cormeau proporcionan estas advertencias. –

Cuestiones relacionadas