我应该禁用C编译器签名/未签名的不匹配警告吗?

Ste*_*nov 15 c compiler-construction warnings

当您尝试比较两个变量时,Microsoft C编译器会发出警告,其中一个是有符号的,另一个是无符号的.例如:

int a;    
unsigned b;

if ( a < b ) { // warning C4018: '&lt;' : signed/unsigned mismatch

}
Run Code Online (Sandbox Code Playgroud)

在世界历史上,这个警告是否曾经发现了一个真正的错误?无论如何,为什么呢?

Mar*_*rko 30

永远不要忽略编译器警告.

  • MSVC曾经发出一堆警告,因为我包含了STL的某些部分.我认为已经训练了许多开发人员来禁用警告或忽略它们,即使MS已经修复它. (3认同)

Joh*_*itb 24

哦,它有.但反过来说.有一天,忽略那个警告给我带来了巨大的麻烦.我正在编写一个绘制图形的函数,并混合有符号和无符号变量.在一个地方,我将负数与无符号数进行比较:

int32_t t; ...
uint32_t ut; ...

if(t < ut) { 
    ...
}
Run Code Online (Sandbox Code Playgroud)

猜猜发生了什么?已签名的数字被提升为无符号类型,因此最终更大,即使它最初低于0.我花了几个小时才找到了这个bug.