这个答案和添加的注释显示了一种使用#pragma
指令禁用多个编译器警告的方法。
为什么要这样做?通常,警告的存在是有原因的,我一直觉得它们是很好的理由。是否有应禁用警告的“有效情况”?现在我什么也想不出来,但也许就是我。
这个答案和添加的注释显示了一种使用#pragma
指令禁用多个编译器警告的方法。
为什么要这样做?通常,警告的存在是有原因的,我一直觉得它们是很好的理由。是否有应禁用警告的“有效情况”?现在我什么也想不出来,但也许就是我。
Answers:
我只有一种情况禁用了警告。我考虑了警告错误,因此通常不会发布警告。但是,在为客户开发API时,我遇到了一个问题,即一个应用程序在迁移阶段需要一种方法,而该库中不应包含任何其他方法。
我可以告诉所有API用户他们不应调用此方法的最好方法是将其标记为过时。但是,这意味着一个有效的用例被标记为编译警告。
埃里克·利珀特(Eric Lippert)写了几篇有关警告的文章,您可以在其中找到有关编译器团队对警告的看法的信息。
以下是一些警告,在这些警告中,文档提供了您可能要禁用它们的原因:
其他示例包括警告,如果您知道仍要使用旧方法或使用从未在本地读取但使用反射的私有成员,则使用折旧方法。
以我的经验,C#与其他语言(例如C ++)相比,禁用警告的需求更少。正如艾里克·利珀特(Eric Lippert)在他的博客中所说,这主要是因为“他们只在我们几乎可以肯定地说代码被破坏,误导或无用的情况下才保留警告”。
有很多理由有选择地禁用编译器警告,即使对于争取最佳实践的项目也是如此。
-isystem
,在某些情况下,系统标题中的差异也会导致可以忽略的警告(也许一个函数在一个系统上具有带符号的返回值,但在另一个系统上没有返回值),从而触发-Wsign-compare
警告。-Wsign-conversion
例如的强制转换)。(void)arg1; (void)arg2; (void)arg3; ...
每个存根函数的主体中。在这种情况下-Wunused-parameter
一下。请注意,在所有这些例子中,它假定的禁止警告不会隐藏真正的bug,如:-Wredundant-decls
,-Wunused-parameter
,-Wdouble-promotion
,也许-Wpedantic
......,你知道你在做什么!
是否有效,有时会绕过构建服务器上的“将警告作为错误处理”指令。
除此之外,我也没有想到。禁用警告通常表示“丑陋的骗局”。
目前,我唯一忽略的警告是
warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
因为微软没有实现C ++规范(文档甚至说它们没有实现),并且不允许函数声明特定的throws,所以所有函数只能抛出throw()或throw(...),即什么也没有。
从HelpViewer 1.1:
A function is declared using exception specification, which Visual C++ accepts but does not implement. Code with exception specifications that are ignored during compilation may need to be recompiled and linked to be reused in future versions supporting exception specifications.