2011-10-10 51 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