Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I output a compile-time numeric constant during compilation in Visual C++?

Visual C++ has #pragma message that outputs a string into compiler output. Now I have a factory:

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

and I want to output the size of class that is passed to new (namely sizeof( CComObject<Type> ) into the compiler output. Looks like #pragma message only accepts strings.

How can I output a compile-time numeric constant?

like image 734
sharptooth Avatar asked Apr 25 '11 06:04

sharptooth


1 Answers

If I understood your question correctly, then I think you can do this:

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

The value of sizeof(CComObject<Type>) will be printed as warning messages during compilation.


See this small demo : http://www.ideone.com/Diiqy

Look at these messages (from the above link):

prog.cpp: In member function ‘overflow::operator char() [with unsigned int size = 4u]’:
prog.cpp: In member function ‘overflow::operator char() [with unsigned int size = 12u]’:
prog.cpp: In member function ‘overflow::operator char() [with unsigned int size = 400u]’:

In Visual Studio, you can see these messages in the Build Output tab; it may not appear in Error List > Warnings tab.


The idea is taken from my another solution:

Calculating and printing factorial at compile time in C++

like image 65
Nawaz Avatar answered Oct 13 '22 19:10

Nawaz