编译时检查变量是否有符号

时间:2019-08-18 03:45:22

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

我正在尝试提出一些编译时方法来检查某个变量是带符号的还是无符号的。实际上,我花了很长时间使用以下宏来检查带符号的变量:

#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 ++标准向后兼容。

1 个答案:

答案 0 :(得分:4)

可以使用类似这样的东西:

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

和姊妹版本std::is_unsigned

此外,要支持旧版本的编译器,很难单独实现这些功能。

相关问题