Принуждение VS2008 выдать предупреждение GCC, похожее на «предупреждение:сравнение между знаковыми и беззнаковыми целочисленными выражениями»
-
25-09-2019 - |
Вопрос
В том же духе, что и описано в преобразование в «size_t» из «int» может изменить знак результата — GCC, C, Вместо этого я хотел бы гарантировать, что предупреждение, которое я получаю в GCC 4.2.1, также помечается в VS2008 SP1 как при 32-битной, так и при 64-битной компиляции, а не при отключении предупреждений в GCC для соответствия VS2008.
Например, в GCC 4.2.1 в 64-битных условиях мы видим следующее предупреждение в условиях -Wall:
#include <string.h>
bool foo()
{
size_t len = 0;
const char * someBuffer = "flubber";
len = strlen(someBuffer);
bool retval = false;
for (int j = 0; j < len; j++) // <-- warning
{
if (someBuffer[j] != '0')
{
retval = true;
break;
}
}
return retval;
}
Предупреждение GCC:
warning: comparison between signed and unsigned integer expressions
Но он не помечается 64-разрядным компилятором VS2008 SP1, независимо от того, какие типы прагм я использую и что я включаю, используя /W3, /W4 или /w3.some_warning_number или /w4some_warning_number, и т. д.
Теперь я не хочу занижать уровни предупреждений GCC или отключать предупреждение, поскольку у них там было предупреждение по очень веским причинам.Поэтому я бы хотел, чтобы сборки VS терпели неудачу аналогичным образом, когда /WX включен.Мне придется с этим жить, или есть какое-то предупреждение, которое помогло бы VS2008?
РЕДАКТИРОВАТЬ:Предупреждение отображается для 32-битных сборок, но не для 64-битных сборок, с использованием того же набора параметров компилятора, как показано ниже:
/O2
/Ob2
/D "WIN32"
/D "_WINDOWS"
/D "NDEBUG"
/D "_CRT_SECURE_NO_WARNINGS"
/D "__WIN32__"
/D "_SCL_SECURE_NO_WARNINGS"
/D "_BIND_TO_CURRENT_MFC_VERSION"
/D "_BIND_TO_CURRENT_CRT_VERSION"
/D "WINVER=0x0502"
/D "_WIN32_WINNT=0x0502"
/D "_WIN32"
/D "_NT"
/D "_CRT_NONSTDC_NO_WARNINGS"
/D "_MBCS"
/FD
/EHsc
/MD
/W3
/WX
/TP
/Zm1000
РЕДАКТИРОВАТЬ № 1:Поскольку это может быть особенностью Visual Studio, я написал в Центр разработчиков Visual C++ — предупреждение C4018:'<' :Несоответствие знака/беззнака выдается для 32-битной, но не 64-битной компиляции под VS2008 SP1 в 64-битной Windows.
РЕДАКТИРОВАТЬ № 2:Мне было предложено опубликовать сообщение в Microsoft Connect из Публикация в Центре разработчиков Visual C++, и сегодня (11 января 2011 г.) Microsoft ответила на мой вопрос и подтвердила, что это проблема компилятора:Они заявили, что проблема будет добавлена в список невыполненных работ и будет исправлена в будущем выпуске: Microsoft Connect — предупреждение C4018:'<' :несоответствие со знаком/без знака возникает только между типами одинакового размера.
Решение 2
Отвечая на мой собственный вопрос:См. мое РЕДАКТИРОВАНИЕ № 2 в исходной области вопроса.Теперь Microsoft признает это проблемой компилятора.
Другие советы
Что-то пошло не так, эта строка кода должна и будет генерировать желаемое «предупреждение C4018:'<' :несоответствие знака/беззнака».
Вот настройки компилятора моего тестового проекта, если они вообще помогают:
/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" /Fp"Debug estproj1.pch /Fo"Debug\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt
РЕДАКТИРОВАТЬ:это проверено в 32-битной Visual Studio, но вы спрашиваете о 64-битной компиляции, поэтому эта информация для вас не актуальна, извините.