2014-01-21 90 views
2

我在CPP中有下面的代碼。C++中的函數聲明

//My code 

#include<iostream> 
using namespace std; 
int main() 
{ 
    int a; 
    int display(); 
    int printfun(display());// Function prototype 
    printfun(9);//Function calling 
    return 0; 
} 
int printfun(int x) 

{ 
    cout<<"Welcome inside the function-"<<x<<endl; 
} 
int display() 
{ 
    cout<<"Welcome inside the Display"<<endl; 
    return 5; 

} 

編譯時會引發錯誤「Line8:'printfun'不能用作函數」。

但是,當我在顯示函數中進行printfun調用時,相同的代碼完美地工作。

#include<iostream> 
using namespace std; 
int main() 
{ 
    int a; 
    int display(); 
    int printfun(display());// Function prototype 
     return 0; 
} 
int printfun(int x) 

{ 
    cout<<"Welcome inside the function-"<<x<<endl; 
} 
int display() 
{ 
    printfun(9); // Function call 
    cout<<"Welcome inside the Display"<<endl; 
    return 5; 

}

誰能解釋這背後的原因是什麼?

+0

而不是'int printfun(display());'try'int printfun(int x)'。正如代碼中提到的那樣,這兩行聲明瞭函數原型,其中函數將在稍後實施。那麼,請看Kugelman的答案:D – wendelbsilva

回答

7
int printfun(display());// Function prototype 

這不是函數原型。這是一個變量聲明,等同於:

int printfun = display(); 

函數原型「可以」裏面的main()來實現,但它更正常的把它們在你的源文件的頂部。

#include <iostream> 

using namespace std; 

// Function prototypes. 
int display(); 
int printfun(int x);  

int main() 
{ 
    int a; 
    printfun(9); // Function call. 
    return 0; 
} 

// Function definitions. 
int printfun(int x) 
{ 
    cout << "Welcome inside the function-" << x << endl; 
} 

int display() 
{ 
    printfun(9); // Function call. 
    cout << "Welcome inside the Display" << endl; 
    return 5; 
} 
+0

感謝John的回覆。但我的問題是,當我給另一個函數內部的函數調用而不是主函數時,修改的代碼(我已發佈)如何將它完美地視爲函數原型? –

1

在這份聲明中

int printfun(display());// Function prototype 

你定義一個名爲printfun int類型是由函數調用顯示的返回值初始化的對象()。你認爲這不是一個函數聲明。

那麼作爲printfun是int類型的對象,然後表達

printfun(9);// 

沒有任何意義和編譯器將發出一個錯誤。

在第二種情況下,代碼被編譯,因爲功能顯示看到聲明爲函數名稱的全局名稱printfun。 main中的printfun在main之外不可見。事實上,對於在main和全局函數名稱中定義的局部變量,它是在全局名稱空間內聲明的函數名稱。功能顯示看到這個全球名稱。