[英]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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.