簡體   English   中英

如何進行與平台相關的檢查,並且沒有-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_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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM