自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?
我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?
评论中要求的示例:
#include <stdio.h>
int stringSize()
{
}
int main()
{
char cstring[5];
printf( "the last char is: %c\n", cstring[stringSize()-1] );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...编译.
偶尔编写一下根本不会发出警告的C++代码是很困难的.然而,启用警告是一个好主意.因此,通常需要禁用某些特定构造周围的警告,并在所有其他代码段中启用它们.
到目前为止,我已经看到了两种方法.
第一个是使用#pragma warning( push )和#pragma warning( pop ):
#pragma warning( push )
#pragma warning( disable: ThatWarning )
//code with ThatWarning here
#pragma warning( pop )
Run Code Online (Sandbox Code Playgroud)
第二是使用#pragma warning( default ):
#pragma warning( disable: ThatWarning )
//code with ThatWarning here
#pragma warning( default: ThatWarning )
Run Code Online (Sandbox Code Playgroud)
我在第二个变体中看到的问题是它丢弃了原始警告级别 - 警告可能在此之前已关闭或警告级别可能已被更改.使用default会丢弃这些改动.
第一种方法看起来很干净.它有什么问题吗?有没有更好的方法来实现同样的目标?
考虑一下代码:
template <typename T>
CByteArray serialize(const T& value)
{
if (std::is_pod<T>::value)
return serializePodType(value);
else if (std::is_convertible<T, Variant>::value)
return serialize(Variant(value));
else
{
assert(0 == "Unsupported type");
return CByteArray();
}
}
Run Code Online (Sandbox Code Playgroud)
显然,编译器给我这个警告if (std::is_pod<T>::value)等是正确的,但是我该如何规避呢?我找不到避免这种检查的方法,而且static if在C++中还没有.
可以使用SFINAE原则来避免这种情况if吗?
有没有办法在Microsoft Visual Studio 2015中禁用错误C4146 - 快速版?我尝试将"将警告视为错误"选项设置为否,但MSVC仍将C4146视为错误.这有什么解决方案吗?
我已阅读此链接,因此对警告的含义有基本的了解。
当我对 MFC 项目运行代码分析时,我收到一系列警告:
d:\my programs\2017\meetschedassist\meeting schedule assistant\synchexclusionsdlg.cpp(295): warning C6031: Return value ignored: 'ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::LoadStringW'.
d:\my programs\2017\meetschedassist\meeting schedule assistant\synchexclusionsdlg.cpp(297): warning C6031: Return value ignored: 'ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::LoadStringW'.
Run Code Online (Sandbox Code Playgroud)
例如,它抱怨这个代码片段:
if (iImage == IMG_CHECKED)
strText.LoadString(IDS_STR_YES);
else
strText.LoadString(IDS_STR_NO);
Run Code Online (Sandbox Code Playgroud)
我已阅读LoadString的帮助文档,讽刺的是他们的示例是这样做的:
CAtlString s;
s.LoadString(IDS_APP_TITLE);
Run Code Online (Sandbox Code Playgroud)
他们也不测试返回值。:)
现在,我意识到我可以尝试修复我的代码并测试返回值 - 这将花费我很长时间!我意识到我可以下意识地忽略这些警告。
但是是否有可能在分析过程中抑制这个特定的警告(关于C6031 CString::LoadString)?
我尝试将其添加到我的stdafx.h(基于评论):
#pragma warning( disable : 6031)
Run Code Online (Sandbox Code Playgroud)
这当然有效。但我希望只是抑制 6031 错误CString::LoadString。
我们有一个大型 C++ 项目,启用错误时会发出警告。我们想弃用一些旧的 API,自然我们的第一个想法就是转向[[deprecated]]语言功能。然而,这会触发-Wdeprecated-declarations警告,该警告会变成错误并使构建失败。
现在,我们知道我们可以通过 禁用该特定警告的错误-Wno-error=deprecated-declarations。但构建日志仍然充满了编译器警告,使得发现真正的编译器错误变得更加困难。
那么我想知道在现实世界的大型项目中,人们是否有更好的解决方案来处理实践中的 C++ 弃用问题?
我已开启-Wall代码以摆脱所有警告。但是有些我想在代码中允许,所以我在代码中禁用了那些。在常见的警告中,我可以轻松地在Google中找到警告编号并将其禁用,例如:
#pragma warning( disable : 4127 )
Run Code Online (Sandbox Code Playgroud)
但是在某些情况下,我找不到对应的号码。例如,我要禁用:
warning : array subscript is of type 'char' [-Wchar-subscripts]
我如何找到它的号码?有可搜索的列表吗?在微软的文档是不是关键字搜索,只有编号。
假设我的代码中有一些警告,例如Clang已经为结构添加了填充.我找到了那个特定的实例,我想把它标记为"Noted;不要再次警告我这个实例".
有没有办法做到这一点,而不是疯狂的冗长(即#pragma clang diagnostic push等)?理想情况下,就像警告在同一行上的评论,如下所示:
// clang(-Wno-padded)
Run Code Online (Sandbox Code Playgroud)
要清楚,我只想抑制警告的一个特定实例(通常需要#pragma diagnostic push/ pop),而不是文件中的所有警告.
如果我选择级别警告(全部) /墙
Studio 显示来自此文件的许多警告:
wchar.h
math.h
xmemory0
xstring
Run Code Online (Sandbox Code Playgroud)
例子:
代码:
std::cout << "\n\n";
Run Code Online (Sandbox Code Playgroud)
编译器:
ios(116): 警告 C4710: std::string std::_Generic_error_category::message(int) const:
也许有一些宏,像这样的?
#define start_warnings
#undef start_warnings
Run Code Online (Sandbox Code Playgroud)