#c #visual-c #build #compilation #constants
#c #visual-c #строить #Сборник #константы
Вопрос:
Следующий код был скомпилирован с помощью MSVC 19.29.30133.0
Учитывая следующую строку c в функции
int foo = 0;
Если на переменную нет ссылки, MSCV выдаст вам следующее предупреждение: warning C4189: 'foo': local variable is initialized but not referenced
Однако, если const
перед ним будет добавлено предупреждение, оно исчезнет.
const int foo = 0; // lt;lt;--This line yields no warning with MSVC 19.29.30133.0
Но эта неиспользуемая переменная все равно должна быть удалена, не так ли?
Так почему же MSVC не дает никаких предупреждений? Это ошибка, есть ли спецификация для неиспользуемых констант?
минимальное размножение:
int main() { int a = 0; const int b = 0; return 0; }
выход:
Starting build... cl.exe /Zi /EHsc /nologo /W4 /std:c 20 /Fe: F:progINF1005Ctstunused_constant.exe F:progINF1005Ctstunused_constant.cpp unused_constant.cpp F:progINF1005Ctstunused_constant.cpp(2): warning C4189: 'a': local variable is initialized but not referenced Build finished with warning(s).
Комментарии:
1. Если бы мне пришлось гадать, я бы предположил, что заголовки обычно определяют константы таким образом, и было бы неприятно, если бы у вас были предупреждения каждый раз, когда вы включали, скажем, заголовок библиотеки.
2. @IgorTandetnik Это происходит и для локальных констант с областью действия. Не только для глобальных констант.
3. Не удается воспроизвести эту проблему. Используя VS2022 (19.30.30706), я получаю C4189 в обеих ситуациях. Поэтому, возможно, вам следует перейти на последнюю версию.
4. @user7860670 Смотрите мой минимальный воспроизводимый пример. Разница вряд ли будет между msvc 19.29 и 19.30.
5. С VS2022 этот пример выдает предупреждения C4189 для обоих
a
иb
.