【发布时间】:2019-08-18 03:45:22
【问题描述】:
我正在尝试提出一些编译时方法来检查某个变量是有符号还是无符号。实际上,我已经使用下面的宏来检查有符号变量有一段时间了:
#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++ 标准。
【问题讨论】:
-
static_assert(std::is_signed_v<T>)? -
依靠所述错误不是检查此问题的可移植方法。无法保证编译器会对此发出警告,或者使用选项将警告转化为错误。
-
@chris:是的。但我以为我把它标记为 VS2017。
标签: c++ visual-studio-2017 macros