我如何有一个平台相关的检查,而没有-Wtype-limits警告

How do I have a platform-dependent check and no -Wtype-limits warning?

本文关键字:警告 -Wtype-limits 检查 有一个 平台      更新时间:2023-10-16

我有这样的代码,这意味着针对不同的编译器和平台:

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_tunsigned 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);
}