以下C ++示例无法使用gcc或clang进行编译,但仅使用ICC生成警告,并且对MSVC一无所知:
int main(int argc, char *argv[])
{
if (argc < 2)
goto clean_up;
#if 1 // FAIL
int i = 0;
#elif 0 // workaround - OK
{
int i = 0;
}
#else // workaround - OK
int i;
i = 0;
#endif
clean_up:
return 0;
}
克++:
init.cpp:13: error: jump to label ‘clean_up’
init.cpp:4: error: from here
init.cpp:7: error: crosses initialization of ‘int i’
铛++:
init.cpp:4:9: error: cannot jump from this goto statement to its label
goto clean_up;
^
init.cpp:7:9: note: jump bypasses variable initialization
int i = 0;
^
ICC:
init.cpp(4): warning #589: transfer of control bypasses initialization of:
variable "i" (declared at line 7)
goto clean_up;
^
我理解错误的原因,并且对于一个简单的例子来说这很容易解决(我在上面的例子中包含了几个可能的解决方法),但是我是处理大型跨平台遗留代码库,其中包含使用类似goto
构造的错误处理宏。使用MSVC或ICC的其他开发人员不断引入内联初始化,随后导致gcc或clang构建错误(当然,他们只是忽略了他们使用MSVC / ICC获得的警告)。
所以我需要找到一种方法来(a)使这种情况导致ICC / MSVC出错或(b)用gcc / clang将它们减少为警告。我用gcc尝试了-fpermissive
,但这似乎没什么帮助。
int
为在上面的例子中,它似乎不是一个问题,简单地将定义+初始化拆分为定义+赋值会使错误消失吗?
答案 0 :(得分:2)
用于将警告视为错误的MSVC标志为/we n
,其中n
是警告的编号。
例如,
/we4326
将警告号C4326标记为错误。
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/thxezb7y.aspx。