Как вывести числовую константу во время компиляции во время компиляции в Visual C ++? - PullRequest
6 голосов
/ 25 апреля 2011

Visual C ++ имеет #pragma message, что выводит строку в вывод компилятора . Теперь у меня есть фабрика:

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

и я хочу вывести размер класса, который передается в new (а именно sizeof( CComObject<Type> ), в вывод компилятора. Похоже, #pragma message принимает только строки.

Как вывести числовую константу во время компиляции?

1 Ответ

6 голосов
/ 25 апреля 2011

Если я правильно понял ваш вопрос, то я думаю, что вы можете сделать это:

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

Значение sizeof(CComObject<Type>) будет напечатано как предупреждающие сообщения во время компиляции.


См. Небольшую демонстрацию: http://www.ideone.com/Diiqy

Посмотрите на эти сообщения (по вышеуказанной ссылке):

prog.cpp: в функции-члене 'overflow :: operator char ()[with unsigned int size = 4u ] ':
prog.cpp: в функции-члене' overflow :: operator char () [with unsigned int * size = 12u ] ':
prog.cpp: В функции-члене 'overflow :: operator char () [с беззнаковым целым size = 400u ]':

В Visual Studio вы можете увидетьэти сообщения на вкладке Build Output ;он может не отображаться в Список ошибок> Предупреждения вкладка.


Идея взята из другого моего решения:

Расчет и печать факториала при компиляциивремя в C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...