2008-09-16 2 views
3

Компилятор Visual Studio, похоже, не предупреждает о подписанных/неподписанных назначениях, только при сравнении. Например, приведенный ниже код будет генерировать предупреждение для оператора if, но не для первоначальных назначений.Сделать компилятор VS компиляцией подписанных/неподписанных заданий?

Есть ли все равно, чтобы заставить их поймать их? Я уже в W4, но думал (надеется), что где-то может быть другая настройка.

Спасибо,

int foo(void) 
{ 
    unsigned int fooUnsigned = 0xffffffff; 
    int fooSigned = fooUnsigned; // no warning 

    if (fooSigned < fooUnsigned) // warning 
    { 
     return 0; 
    } 

    return fooSigned; 
} 

Update:

Quamrana прав, это контролируется предупредив 4365, который, как представляется, будет отключена по умолчанию, даже при W4. Однако вы можете явно включить его для заданного уровня предупреждения;

#pragma warning (4 : 4365) 

Какой результат;

warning C4365: 'initializing' : conversion from 'unsigned int' to 'int', signed/unsigned mismatch 
+0

Я не знал, что есть # прагма для включения предупреждений. Проблема с #pragma заключается в том, что ее необходимо повторять в каждом модуле, где вы хотите получить предупреждение. – quamrana 2008-09-16 21:52:55

ответ

6

Вам необходимо включить предупреждение 4365, чтобы получить назначение.

Это может быть сложно: вам нужно включить ВСЕ предупреждения - используйте/Стена, которая позволяет много предупреждений, поэтому у вас могут возникнуть проблемы с обнаружением предупреждения, но это так.

+0

Вы также можете использовать предупреждение #pragma (по умолчанию: 4365) для включения. – ChrisN 2008-09-16 18:56:06

0

@quamrana:

Там должно быть что-то за параметром/Wall, чтобы дать предупреждение 4365:

C:\Temp>cl /Wall /c foo.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

foo.c 
foo.c(6) : warning C4018: '<' : signed/unsigned mismatch 

Я вижу, что Андрей получил его на работу, но кто-нибудь есть идея, почему это не здесь работает?

Документы Visual Studio указывают, что это должно быть, но я не могу даже получить пример программы в документах, чтобы дать предупреждение C4365 (хотя оно дает соответствующее предупреждение C4245, но это происходит только с опцией/W4 так или иначе).

2

Вы можете изменить уровень любого предупреждения, используя/W [уровень] [код]. Таким образом, в этом случае/W34365 будет предупреждать 4365 о предупреждении уровня 3. Если вы это сделаете, вам может оказаться полезным разместить эти параметры в текстовом файле и использовать параметр @ [файл], чтобы упростить командную строку.

+0

В/w должен быть нижний регистр. – 2015-02-27 20:10:06

Смежные вопросы