新的 C++ 警告会提高可靠性吗?
Do new c++ warnings improve reliability?
所以,我在 C# 中工作了很长时间后一直在 C++ 中工作,我注意到现在有所有这些警告。
虽然一些警告似乎是使代码更可靠的好建议,但其中许多似乎并非如此。其中一些似乎完全错误。
这是一个我觉得不值得的例子:
static TCHAR szGeneral[] = _T("General");
static TCHAR szSqlOdbcDriver[] = _T("SqlOdbcDriver");
WriteProfileString(szGeneral, szSqlOdbcDriver, CSqlServerDatabase::m_sOdbcDriver.GetString());
Warning C26485 Expression 'szGeneral': No array to pointer decay (bounds.3).
Warning C26485 Expression 'szSqlOdbcDriver': No array to pointer decay (bounds.3).
我的问题是:这会让我的代码变得更好吗?
我承认我不得不关闭警告,因为我的项目有将近 800 个警告。 (十年前编写的代码被认为是完全有效的。)所以我会错过所有好的建议。结果是我的代码更糟。
IMO 视情况而定。
例如,编译器发出警告,因为一旦将 char[] 传递给函数,就会丢失 sizeof() 信息。但是,这甚至可能无关紧要,因为字符串是空终止的。但是请考虑 nullptr 不知何故消失的情况。那么你将如何在函数中计算它的长度呢?
为了在这种情况下帮助编译器,我建议明确告诉编译器您知道自己在做什么。这也使意图可见。
考虑 -
long b = 50;
int a = b;
将生成编译器警告,但根据使用情况,它可能是安全的。
但是你让团队成员猜测(这是故意的还是错误的?)。
其中
long b = 50;
int a = static_cast<int>(b);
表明这是有意的。
请注意,此警告来自最近添加到 Visual Studio 的核心指南检查器。只有当您从头开始编写新代码并准备好遵循核心指南时,来自此检查器的警告才有意义。否则,关闭检查器。
检查器是静态代码分析器的一部分,您可能不应该在编译中包含该分析器。
在您的项目属性中,您在 C/C++-->Command Line
中有 /analyze
。你应该摆脱这个标志(我不知道如何为你的 Visual Studio 版本做这件事)。
不要关闭所有警告。
所以,我在 C# 中工作了很长时间后一直在 C++ 中工作,我注意到现在有所有这些警告。
虽然一些警告似乎是使代码更可靠的好建议,但其中许多似乎并非如此。其中一些似乎完全错误。
这是一个我觉得不值得的例子:
static TCHAR szGeneral[] = _T("General");
static TCHAR szSqlOdbcDriver[] = _T("SqlOdbcDriver");
WriteProfileString(szGeneral, szSqlOdbcDriver, CSqlServerDatabase::m_sOdbcDriver.GetString());
Warning C26485 Expression 'szGeneral': No array to pointer decay (bounds.3).
Warning C26485 Expression 'szSqlOdbcDriver': No array to pointer decay (bounds.3).
我的问题是:这会让我的代码变得更好吗?
我承认我不得不关闭警告,因为我的项目有将近 800 个警告。 (十年前编写的代码被认为是完全有效的。)所以我会错过所有好的建议。结果是我的代码更糟。
IMO 视情况而定。 例如,编译器发出警告,因为一旦将 char[] 传递给函数,就会丢失 sizeof() 信息。但是,这甚至可能无关紧要,因为字符串是空终止的。但是请考虑 nullptr 不知何故消失的情况。那么你将如何在函数中计算它的长度呢?
为了在这种情况下帮助编译器,我建议明确告诉编译器您知道自己在做什么。这也使意图可见。 考虑 -
long b = 50;
int a = b;
将生成编译器警告,但根据使用情况,它可能是安全的。 但是你让团队成员猜测(这是故意的还是错误的?)。 其中
long b = 50;
int a = static_cast<int>(b);
表明这是有意的。
请注意,此警告来自最近添加到 Visual Studio 的核心指南检查器。只有当您从头开始编写新代码并准备好遵循核心指南时,来自此检查器的警告才有意义。否则,关闭检查器。
检查器是静态代码分析器的一部分,您可能不应该在编译中包含该分析器。
在您的项目属性中,您在 C/C++-->Command Line
中有 /analyze
。你应该摆脱这个标志(我不知道如何为你的 Visual Studio 版本做这件事)。
不要关闭所有警告。