2014-12-07 61 views
-1

爲什麼會導致未定義的引用?使用指向未定義成員函數的指針時未定義的引用

struct A { void f(); }; 

int main() 
{ 
    auto f = &A::f; 
} 

在我能得到指針之前,函數是否必須定義?爲什麼會導致鏈接器錯誤?

更新:我剛剛發現編譯no optimizations給出了未定義的參考。

+2

當您使用* *呢?這個代碼本身不應該有任何問題。 – 2014-12-07 22:10:43

+0

@remyabel當我沒有優化編譯它會給鏈接器錯誤。否則[它不](http://coliru.stacked-crooked.com/a/d08afd3f20ff588e)。 – 2014-12-07 22:18:08

+0

如果你啓用優化,編譯器可能會優化你的程序一直到'int main(){return 0; }'。這就是爲什麼這個問題似乎消失了。 – 5gon12eder 2014-12-07 22:21:19

回答

4

你想獲得地址不存在的變量。 (就此而言,函數是const變量的一種)

你現在擁有的就像是一個前向聲明。你聲明一個函數但不執行它(它類似於缺少extern變量)。

地址本身應該在鏈接期間給出,但是當鏈接器搜索它時,它就會丟失。

此外,函數可以在主函數之後,甚至在其他文件中執行,但編譯器在串行處理中一次處理一個文件。因此編譯器無法知道該函數在任何地方都沒有實現。

所以沒有編譯錯誤,因爲有前向聲明,名稱是已知的,但有鏈接錯誤,因爲函數被使用但沒有實現。

1

它沒有實現,所以函數不存在,並且鏈接器找不到它的地址。相反的:

struct A { void f(); }; 

用途:

struct A { void f() {} };