gpt4 book ai didi

c++ - 为什么会编译,是否有任何编译器开关可以使编译器将其报告为错误或警告?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:47 28 4
gpt4 key购买 nike

当我在我正在处理的项目的源代码上运行 PCLint 时,我发现了这个例子。这是代码片段:

QString foo()
{
return false;
}

我编译了代码并验证它返回了一个空字符串。真实的例子是一个大类中的一个大方法,在某个远程 if 分支的某个地方,有这个孤立的

return false;

好吧,这是糟糕的编码,对开发人员来说是可耻的(通过使用 SVN/blame 我什至可以找出是谁做的:-))但是,说真的,为什么编译器不提示?

我的理论是编译器翻译

return false;

return QString(((const char *) false));

但是,我没有看到编译器为推断这一点而执行的所有基本步骤。它首先尝试 QString 的所有构造函数,并找到

QString(const * char);

然后呢?它如何确定它可以从 bool 到 const char *。或者每当您在需要指针的地方使用 bool 时,它会自动将 bool 转换为任何指针类型吗?

问题的第二部分。由于所有这些隐式类型转换都非常危险(如果开发人员的意思是“返回空字符串”,为什么开发人员会写“return false;”?),有没有办法(例如编译器开关)至少报告这种情况作为警告?我在 g++ 中尝试了 -Wall,它没有打印任何警告。

编辑

感谢您的提示。 false 似乎有特殊待遇。如果我这样做

return true;

我得到:

error: conversion from ‘bool’ to non-scalar type ‘QString’ requested

我在 Ubuntu 上使用 g++ 4.4.3。正如不同评论中所指出的,其他编译器报告了该问题。

最佳答案

false 等于零。零是一种特殊情况,表示 NULL 指针,将在没有警告的情况下转换为任何指针类型。

令我惊讶的是,编译器允许将此作为​​一步转换,而不认为这是从 booleanint 的两步转换,然后 intchar* - 两步转换不是隐式完成的。

关于c++ - 为什么会编译,是否有任何编译器开关可以使编译器将其报告为错误或警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718214/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com