2012-07-16 78 views
1

我遇到了一個關於編寫代碼以確定C++中未使用函數的問題。我們可以使用不同的數據結構來確定未使用的函數。但在此之前,我們需要解析代碼。我有關於解析部分的問題,我們如何區分函數聲明和定義以及函數調用?確定函數聲明,定義和調用

一樣,

//function declaration without argument 
fun1(); 

//function definition 
fun1() { 
    // code goes here 
    } 

main() { 
    fun1(); 
    } 

上面的聲明和調用看起來相同的地方定義部分是從申報和呼叫有點不同。

除了上面的場景外,還有多種調用函數和函數作用域的場景,比如兩個函數具有相同名稱的類一個函數在成員函數中調用(即不需要顯式調用對象)或者使用對象調用函數,首先需要了解對象的類型以確定實際調用哪個函數。

解析如何有效地執行?在上述情況下需要多少分析?

+0

我不是C++大師,但不要函數聲明和定義表示返回值類型? – Adi 2012-07-16 09:33:37

+2

@Adnan除非你認爲'implicit int'沒錯。 @Sachin解析C++非常困難。我建議使用'libclang'來爲你做解析,並用它做你的靜態分析,而不是自己去做。這對模板來說非常困難。 – pmr 2012-07-16 09:35:00

+0

謝謝@pmr,我應該更多地參與C++。 – Adi 2012-07-16 09:35:56

回答

3

這是你如何區分它們:

//function definition 
return_type fun1 (args) { 
    // code goes here 
} 

注意函數定義有函數名前「返回類型」。

另外,請注意函數聲明看起來和它的定義完全一樣。除非您看到;{,否則實際上並不需要區分它們。這就是您決定是否聲明或定義的關鍵。在您的特定應用程序中,您並不關心它,因爲您不關心該功能的實際功能。

不幸的是,C++很複雜。爲了確定哪些功能是無用的,你實際上至少需要一個基本的語義分析。這至少包括類型系統。

更糟糕的是,有些函數可能不一定直接調用,而是通過虛函數調用。所以你對代碼的靜態分析只會顯示父母的功能被調用,而實際上這是孩子的功能。

+0

這讓我想起了巨蟒:「鴨子有什麼區別?」儘管如此,你是否認爲函數聲明沒有返回類型呢? – 2012-07-16 09:37:33

+0

我在說什麼? – Shahbaz 2012-07-16 09:38:19

+0

啊,我明白你的意思了!更新了我的答案。 – Shahbaz 2012-07-16 09:38:31