相关疑难解决方法(0)

为什么在没有返回值的情况下流出非void函数的末尾不会产生编译器错误?

自从我多年前意识到这一点,默认情况下这不会产生错误(至少在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 c++ gcc g++

157
推荐指数
5
解决办法
4万
查看次数

是否正确使用#pragma warning push/pop来暂时改变警告级别?

偶尔编写一下根本不会发出警告的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会丢弃这些改动.

第一种方法看起来很干净.它有什么问题吗?有没有更好的方法来实现同样的目标?

c++ warnings pragma compiler-warnings visual-c++

70
推荐指数
4
解决办法
5万
查看次数

如何在模板代码中使用编译时常量条件避免"条件表达式是常量"警告?

考虑一下代码:

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吗?

c++ templates

15
推荐指数
4
解决办法
1699
查看次数

MSVS 2015表示错误C4146 - 应用于无符号类型的一元减运算符

有没有办法在Microsoft Visual Studio 2015中禁用错误​​C4146 - 快速版?我尝试将"将警告视为错误"选项设置为否,但MSVC仍将C4146视为错误.这有什么解决方案吗?

c++ compiler-errors visual-studio

5
推荐指数
1
解决办法
3033
查看次数

我可以抑制特定的 C6031 警告吗?CString::LoadString

我已阅读此链接,因此对警告的含义有基本的了解。

当我对 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

mfc code-analysis visual-studio-2017

5
推荐指数
1
解决办法
3829
查看次数

弃用 C++ 代码并将警告视为错误的最佳实践?

我们有一个大型 C++ 项目,启用错误时会发出警告。我们想弃用一些旧的 API,自然我们的第一个想法就是转向[[deprecated]]语言功能。然而,这会触发-Wdeprecated-declarations警告,该警告会变成错误并使构建失败。

现在,我们知道我们可以通过 禁用该特定警告的错误-Wno-error=deprecated-declarations。但构建日志仍然充满了编译器警告,使得发现真正的编译器错误变得更加困难。

那么我想知道在现实世界的大型项目中,人们是否有更好的解决方案来处理实践中的 C++ 弃用问题?

c++ deprecated deprecation-warning

5
推荐指数
1
解决办法
968
查看次数

如何找出C ++警告的数量

我已开启-Wall代码以摆脱所有警告。但是有些我想在代码中允许,所以我在代码中禁用了那些。在常见的警告中,我可以轻松地在Google中找到警告编号并将其禁用,例如:

#pragma warning( disable : 4127 )
Run Code Online (Sandbox Code Playgroud)

但是在某些情况下,我找不到对应的号码。例如,我要禁用:

warning : array subscript is of type 'char' [-Wchar-subscripts]

我如何找到它的号码?有可搜索的列表吗?在微软的文档是不是关键字搜索,只有编号。

c++ compiler-warnings suppress-warnings c++11

2
推荐指数
1
解决办法
874
查看次数

在Clang中禁用特定警告实例的简明方法

假设我的代码中有一些警告,例如Clang已经为结构添加了填充.我找到了那个特定的实例,我想把它标记为"Noted;不要再次警告我这个实例".

有没有办法做到这一点,而不是疯狂的冗长(即#pragma clang diagnostic push等)?理想情况下,就像警告在同一行上的评论,如下所示:

// clang(-Wno-padded)
Run Code Online (Sandbox Code Playgroud)

要清楚,我只想抑制警告的一个特定实例(通常需要#pragma diagnostic push/ pop),而不是文件中的所有警告.

c++ clang

1
推荐指数
2
解决办法
2454
查看次数

是否可以关闭编译器警告?

如果我选择级别警告(全部) /墙

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)

c++ visual-studio visual-studio-2013

-2
推荐指数
1
解决办法
494
查看次数