使Visual Studio警告未签名的比较

使用Visual Studio 2010编译时,此代码

#include  #include  int numbers[] = { 23, 24, 25, 25, 28, 20, 20 }; int main(void) { int d = -1, x=0; size_t count = sizeof(numbers) / sizeof(numbers[0]); if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2) x = numbers[d+1]; if (d <= count-2) x = numbers[d+1]; } 

给我一个有符号/无符号的不匹配警告if (d <= count-2)但不是on if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2) 。 为什么是这样? 我启用了所有警告。

在这种情况下,Visual C ++编译器不会发出警告C4018是一个错误。 请参阅Microsoft Connect错误报告, “警告C4018(有符号/无符号不匹配)sizeof运算符。”

该问题似乎只与sizeof使用间接相关。 在比较中涉及无符号类型的常量值的其他情况下,编译器也无法发出警告。 例如,如果将const -qualification添加到count ,则即使进行第二次比较,也不会发出C4018。

我的猜测是它将2视为一个int因此将(sizeof(numbers) / sizeof(numbers[0]))-2)提升为int因为括号因此comaprison是int < int

size_t被定义为unsigned,因此您将获得签名的无符号冲突。

请注意,由于sizeof在编译期间被评估,并且正在被常量值替换,因此它不会抱怨符号不匹配,但在另一个表达式中,您显式地将值转换为size_t变量,当您尝试时该变量可能会溢出与签名号码进行比较。