我如何进行平台相关检查并且没有-Wtype-limits警告?

时间:2015-08-24 07:40:24

标签: 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];

技术size_t可以小于unsigned long或相反,或者它们可以具有相同的大小。

在某些目标上,size_tunsigned long都是64位,代码实际上会检查某些内容并进行干净编译。然而,在其他目标size_t是64位且unsigned long是32位,对于此类平台,检查毫无意义 - long永远不会超出size_t溢出 - 并且所以当与-WExtra一起使用时,gcc会发出警告:

  

警告:由于数据类型的范围有限[-Wtype-limits]

,因此比较始终为false

gcc在这些目标上技术上是正确的,但我需要这个检查以防万一。

如何保持检查并使用gcc干净地编译此代码?

1 个答案:

答案 0 :(得分:3)

使用模板和专业化:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id='dd1'>
  <option>select</option>
  <option value='A'>A</option>
  <option value='B'>B</option>
  <option value='C'>C</option>
</select>
<select id='dd2'>
  <option>select</option>
  <option value='foo'>Foo</option>
  <option value='bar'>Bar</option>
  <option value='baz'>Baz</option>
</select>