當我嘗試使用啓用了警告級別/ W4的Visual Studio 2010 C++編譯器(X86)編譯以下C++程序時,出現簽名/未簽名不匹配警告標記線。C++:僅當使用無符號類型時出現簽名/未簽名不匹配
#include <cstdio>
#include <cstdint>
#include <cstddef>
int main(int argc, char **argv)
{
size_t idx = 42;
uint8_t bytesCount = 20;
// warning C4389: '==' : signed/unsigned mismatch
if (bytesCount + 1 == idx)
{
printf("Hello World\n");
}
// no warning
if (bytesCount == idx)
{
printf("Hello World\n");
}
}
這使我困惑,因爲我只使用無符號類型。由於比較
bytesCount == idx
不會引起這樣的警告,它可能與這裏發生的一些奇怪的隱式對話有關。
因此:我得到這個警告的原因是什麼,以及這個對話發生了什麼規則(如果這是原因)?
如何告訴編譯器不要警告我有關這樣的問題,如果從程序代碼中可以清楚地看到比較是安全的,但我不想禁用整個文件的警告,並且我不想讓代碼變得醜陋避免它。 是否存在任何方式來實現這一目標? – Arkady 2016-11-10 13:21:00
@Arkady如果編譯器被配置爲警告代碼,您不想更改代碼(因爲它會更醜),並且您不想更改編譯器的配置(因爲它會抑制有用的警告也是如此),你不會留下很多選擇。我認爲你還沒有排除的唯一選擇就是編寫黑客程序來改進它的分析。 – hvd 2016-11-11 14:27:57