C++ 如何进行平台相关检查和无类型限制警告?

C++ 如何进行平台相关检查和无类型限制警告?,c++,gcc,compiler-warnings,gcc-warning,C++,Gcc,Compiler Warnings,Gcc 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]; long value=ActainLongValue(); 如果(值

我有这样的代码,旨在针对各种编译器和平台:

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];
long value=ActainLongValue();
如果(值=(大小t)-1)
handleError();
大小\u t值assizet=值;
字符*缓冲区=新字符[值+1];
技术上的
大小\u t
可以小于
无符号长
,或者相反,也可以相同大小

在某些目标上,
size\u t
unsigned long
都是64位的,代码实际上会检查某些内容并进行干净的编译。但是在其他目标上,
size\u t
是64位,
无符号长
是32位,对于这样的平台,检查是没有意义的-
long
的长度永远不会溢出
size\u t
,因此gcc在与
-WExtra
一起使用时会发出警告:

警告:由于数据类型[-Wtype limits]的范围有限,比较始终为false

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

template@JoachimPileborg AFAIK这是获得“大小的最大值”的推荐方法@JoachimPileborg是的,这是我的问题。啊,是的。我想我需要我的早餐咖啡(或同等品)…:)我认为推荐的方法是
std::numeric\u limits::max()
:),这很令人印象深刻。“有没有什么方法可以证明这不是过度杀伤力呢?”夏普图特怎么会有过度杀伤力呢?如果您在编写时不知道类型,但编译器不知道,则模板是solution@Joe一种看待它的方式是。。。这是一个模板和专门化,只是为了摆脱编译器警告@sharptooth专门化是C++的编译时(如果需要)。当然,如果ULONG\u MAX>=SIZE\u MAX
,您也可以尝试
。或者是一个本地的
#pragma
,但这肯定更糟糕,而且依赖于编译器。我认为这个解决方案足够短,比依赖于编译器的
#pragma
更可取。一种可能的替代方法是使用一个非constexpr临时变量来存储MaxSizeT,而hope than编译器并没有看到这种攻击。