前向聲明

程序設計中,前向聲明Forward Declaration)是指提前聲明,但還沒有給出完整的定義的標識符(表示編程的實體,如數據類型、變量、函數)。

例子

一個簡單的C/C++例子:

void printThisInteger(int);

C++中, 上行代碼是一個函數的前向聲明,也是該函數的原型。編譯器處理該行源碼後,允許程式設計師在隨後的程序中引用函數printThisInteger; 不過程式設計師必須在某處提供這個被聲明的函數的定義:

void printThisInteger(int x) {
   printf("%d\n", x);
}

Pascal與其它Wirth型的程式語言中, 一般規則是所有實體必須在使用前被聲明. C語言適用同樣的規則, 但存在未聲明的函數與不完備的數據類型這樣的特例. 因此,C語言允許(雖然不夠明智)實現一對互遞歸函數:

// 前向声明

int second(int);

int first(int x) {
   if (x == 0)
      return 1;
   
   return second(x-1);
}

int second(int x) {
   if (x == 0)
      return 0;
   
   return first(x-1);
}

在Pascal程序中, 同樣的實現要求在first引用second前,必須有一個second的前向聲明. 如果沒有這個前向聲明, 編譯器將產生編譯錯誤,指出標識符second未經聲明即被使用.

前向引用

前向引用(英語:forward reference)有時被用作前向聲明的同義詞[1]。但是,它更經常被用作一個實體在聲明前即被實際使用; 例如, 上述代碼中second第一次使用就是前向引用[2][3]。因此,可以說在Pascal中, 前向聲明是強制要求,前向引用是被禁止的.

C++中前向引用的例子:

class C {
public:
   void mutator(int x) { myValue = x; }
   int accessor() { return myValue; }
private:
   int myValue;
};

在此例中,對myValue的兩次引用早於它的聲明. C++一般禁止前向引用, 但是允許在類成員的特殊場合下使用前向引用。因此,成員函數accessor不能被編譯直到編譯器獲知成員變量myValue的類型, 編譯器有責任記住accessor的定義直到它看到myValue的聲明.

允許前向引用大大增加了編譯器的複雜度與內存需求,並且使它不能成為一次通過型的編譯器。

參考資料

  1. ^ MSDN: Converting to a Forward-Reference Class Type. [2011-08-01]. (原始內容存檔於2008-03-28). 
  2. ^ 存档副本 (PDF). [2011-08-01]. (原始內容存檔 (PDF)於2016-03-03). 
  3. ^ Thinking in C++: Inlines & the compiler. [2011-08-01]. (原始內容存檔於2011-07-09).