C++函數原型詳解

2020-07-16 10:04:39
在編譯器遇到對特定函數的呼叫之前,它必須已經知道有關函數的某些內容。特別是,它必須知道函數使用的形參的數量、每個形參的型別以及函數的返回型別。通常,這可以通過在程式中包含一個函數原型來實現。當然,main 函數除外,它永遠不需要原型,因為它是程式的起點。

看一個程式範例:
// This program has two functions: main and displayMessage.
#include <iostream>
using namespace std;

// Function prototype
void displayMessage();
//mian函數
int main()
{
    cout << "Hello from main.n";
    displayMessage(); // Call.displayMessage
    cout << "Now we are back in the main function again. n";
    return 0;
}

void displayMessage()
{
    cout << "Hello from the displayMessage function.n";
}
此程式中 displayMessage 函數的原型為:

void displayMessage();

這個原型看起來類似於函數頭,只不過最後有一個分號。該語句告訴編譯器,函數 displayMessage 不使用形參,並且具有 void 返回型別,這意味著它不返回值。

程式中,displayMessage 函數原型被放在 main 函數的上面。如果沒有該原型放在那裡,為編譯器提供必要的資訊,那麼就必須將整個 displayMessage 函數的定義語句放置在 main 函數之前,這樣才能呼叫它,如下面程式所示:
// This program has two functions: main and displayMessage.
#include <iostream>
using namespace std;

void displayMessage()
{
    cout << "Hello from the displayMessage function.n";
}

//mian函數
int main()
{
    cout << "Hello from main.n";
    displayMessage(); // Call.displayMessage
    cout << "Now we are back in the main function again. n";
    return 0;
}
有些程式設計師更喜歡使用這種組織結構,將 main 函數放在最後面。但是,絕大多數程式設計師還是認為,對於除 main 之外的其他函數來說,使用一個原型語句將它放置在 main 前面更加方便。特別是在一個程式中包含許多函數,而這些函數又呼叫其他函數的情況下,這樣處理好處更大。

比如說,若一個程式中包含有 3 個函數:main、deep 和 deeper,其中 deeper 函數在 deep 函數中呼叫,那麼如果沒有函數原型的話,就必須先對它們進行正確的順序組織:
  • 函數 deeper 需要放置在最前面,這樣 deep 才能呼叫它。
  • 函數 deep 需要第 2 個放置,這樣 main 才能呼叫它。
  • main 函數放在最後。

注意,在呼叫函數之前,必須放置函數定義或使用函數原型,否則程式將無法編譯。

在使用函數原型之後,實際上的函數定義語句就可以隨意放置而不必擔心順序問題了。只要將原型語句放置在程式頂部,緊隨在 using namespace std; 語句之後即可,這樣做將確保它們在 main 或其他函數之前被識別。