2011-10-10 50 views
5

我在我正在开发的项目的源代码上运行PCLint时发现了这个例子。这里是代码片段:这是为什么编译,并且是否有编译器开关可以让编译器报告它为错误或警告?

QString foo() 
{ 
    return false; 
} 

我编译了代码,并验证它返回一个空字符串。真正的例子是一大类大的方法,以及地方在一些偏远如果分支,有这个与世隔绝的

return false; 

好吧,这是坏的编码,可耻的开发(通过使用SVN /怪我所能甚至找出是谁做的:-)),但是,严重的是,为什么编译器不会抱怨呢?

我的理论是,编译器将

return false; 

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

不过,我没有看到所有的编译器来推断这个执行的基本步骤。它首先尝试QString的所有构造函数,并发现

QString(const * char); 

但是呢?它如何确定它可以从布尔到const char *。或者它是否会在你使用一个指针所在的布尔的任何时候自动地将一个布尔值转换为任何指针类型?

问题的第二部分。由于所有这些隐式类型转换都是相当危险的(为什么开发人员会写'return false',如果它们意味着“返回一个空字符串”?),有没有办法(例如编译器开关),以至少报告这种情况作为警告?我试过了 - 用g ++编译,并没有打印任何警告。

编辑

谢谢你的提示。虚假似乎有特殊待遇。如果我做

return true; 

我得到:

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

我使用G ++ 4.4.3在Ubuntu。正如在不同的评论中指出的那样,其他编译器报告了这个问题。

+0

铿锵有关它的警告,有一个这样的情况。 – Dani

+0

GCC(至少4.5)**没有**警告它。 – Mat

+4

在这里为'explicit'构造函数插入插件。 –

回答

7

false等于零。零是表示NULL指针的特殊情况,并且将被转换为任何指针类型而不发出警告。

我很惊讶的是,编译器允许这是一个单步转换,并没有考虑从boolean两步转化为int,然后intchar* - 两步转换都没有做含蓄。

+0

但是false的类型为bool,而0的类型为int。演员是否自动演奏? – Giorgio

+0

GCC警告:'警告:将'false'转换为'QString :: QString(const char *)'参数1的指针类型'' – Mat

+0

奇怪的是,我没有收到任何警告。使用g ++(Ubuntu 4.4.3-4ubuntu5)4.4.3。我有 - 在命令行上。 – Giorgio