如何在Visual C++编译期间输出编译时数值常量?

6

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只接受字符串。

如何输出编译时数值常量?


我手头没有VC,但对于GNU和clang,一个简单的std::enable_if_t<false,char[sizeof(CComObject<Type>)]>就可以完成工作。 - Weijun Zhou
1个回答

7
如果我理解你的问题正确,那么我认为你可以这样做:
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() [with unsigned int size = 400u]’中:

在Visual Studio中,您可以在“生成输出”选项卡中查看这些消息。它可能不会出现在“错误列表 > 警告”选项卡中。
这个想法来自于我的另一个解决方案: 在C++中计算和打印阶乘的编译时实现

1
@Nawaz,+1好答案,但是它会对所有编译器都一致地产生编译警告吗?(它不能成为其他编译器的错误或忽略消息吗?) - iammilind
如果char的位数大于8位,则不需要溢出。而且,无论是gcc还是Cormeau的在线编译器都不提供这些警告。 - Dennis Zickefoose
@Nawaz:char 的最大值肯定不是由标准定义的,只有大小(1)是定义好的。 - ildjarn
@ildjarn: 这是由C标准定义的,而C++遵循它。 - Nawaz
@Nawaz:不,C标准规定该值应为“与所示相同符号的大小(绝对值)相等或更大”,因此char的最大值至少为255,而不是恰好为255 - ildjarn
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接