我如何有一个平台相关的检查,而没有-Wtype-limits警告
How do I have a platform-dependent check and no -Wtype-limits warning?
我有这样的代码,这意味着针对不同的编译器和平台:
long value = obtainLongValue();
if(value <= 0)
handleError();
if((unsigned long)value >= (size_t)-1)
handleError();
size_t valueAsSizeT = value;
char* buffer = new char[value + 1];
从技术上讲,size_t
可以比unsigned long
小,或者相反,或者它们可以具有相同的大小。
在某些目标上,size_t
和unsigned long
都是64位的,代码实际上检查了一些东西并且编译得很干净。然而在其他目标上,size_t
是64位的,unsigned long
是32位的,对于这样的平台,检查是没有意义的——long
永远不会长到溢出size_t
——所以gcc在与-WExtra
一起使用时会发出警告:
警告:由于数据类型范围有限,比较总是为假[-Wtype-limits]
gcc在这些目标上在技术上是正确的,但我需要这个检查以防万一。
我如何保持检查,并有这段代码编译干净与gcc?
使用模板和特殊化:
template <bool = sizeof(unsigned long) <= sizeof(std::size_t)>
constexpr bool CheckLongLessThanMaxSizeT(unsigned long value)
{
return true;
}
template <>
constexpr bool CheckLongLessThanMaxSizeT<false>(unsigned long value)
{
return value <= static_cast<std::size_t>(-1);
}
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- 我如何有一个平台相关的检查,而没有-Wtype-limits警告
- 修复警告"comparison is always false due to limited range of data type [-Wtype-limits]"