首页 > 解决方案 > 编译时检查变量是否有符号/无符号

问题描述

我试图想出一些编译时方法来检查某个变量是有符号还是无符号。实际上,我使用以下宏已经有很长一段时间来检查有符号变量:

#ifdef _DEBUG
#define CHECK_SIGNED(v) if((v) == -(v)){}
#else
#define CHECK_SIGNED(v)
#endif

然后以下将通过它:

INT rr = 0;
CHECK_SIGNED(rr);

而以下:

UINT rr = 0;
CHECK_SIGNED(rr);

将产生编译时错误:

错误 C4146:一元减号运算符应用于无符号类型,结果仍然无符号

所以现在我正在尝试对unsigned变量进行类似的检查。有什么建议么?

PS。虽然我正在使用VS 2017它,但让它向后兼容旧的 C++ 标准会很好。

标签: c++visual-studio-2017macros

解决方案


可以使用这样的东西:

static_assert(std::is_signed<decltype(rr)>::value, "Not signed number");

和姐妹版std::is_unsigned

此外,为了支持旧编译器,您自己实现这些并不是很困难。


推荐阅读