前向聲明
外觀
在程序設計中,前向聲明(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
的聲明.
允許前向引用大大增加了編譯器的複雜度與內存需求,並且使它不能成為一次通過型的編譯器。
參考資料
[編輯]- ^ MSDN: Converting to a Forward-Reference Class Type. [2011-08-01]. (原始內容存檔於2008-03-28).
- ^ 存档副本 (PDF). [2011-08-01]. (原始內容存檔 (PDF)於2016-03-03).
- ^ Thinking in C++: Inlines & the compiler. [2011-08-01]. (原始內容存檔於2011-07-09).