2012-09-15 170 views
3

我在使用wglGetProcAddress的代碼中獲得了GL函數。該指南的作者(https://sites.google.com/site/opengltutorialsbyaks/introduction-to-opengl-3-2---tutorial-01)說我需要定義如下功能:爲什麼我需要extern?

extern PFNGLCREATEPROGRAMPROC glCreateProgram; 

使用extern關鍵字。但我沒有嘗試過,並且工作正常(編譯成功完成,程序成功使用該函數)。爲什麼我一般需要這個關鍵字,在這種情況下?

回答

3

extern告訴編譯器,定義的名稱在另一個編譯單元中。 默認情況下,全局函數定義爲extern。這涵蓋了爲什麼它在你的情況下工作。

一個地方,你會使用它,是定義和聲明全局變量時。

如果編譯單元需要知道的全局變量(比如互斥量),則需要使其在該單元中可用。但是,如果你這樣做:

int a; // in global scope 

編譯器將嘗試在程序靜態內存爲它分配內存,並會給出一個redifinition錯誤。 extern來到我們這裏救援。通過撰寫:

extern int a; 

我們正在提供全局聲明,但不爲其分配內存。

但是由於不喜歡使用全局變量,所以很少看到它在使用中。

+0

但它工作,即使我在課堂上定義這個函數爲靜態(不是全局函數)。在這種情況下編譯器做什麼?爲什麼我不需要extern? – user14416

+0

@ user14416本教程不會說*需要*使用extern,它只是向您展示了使用extern的一種方法。你沒有使用extern就找到了不同的方法。沒關係。迪馬對於extern的做法有一個很好的解釋,除了他似乎沒有意識到你聲明瞭一個全局變量而不是全局函數。 – john

+0

@ user14416,C++相當多地重載了'static'的使用。 在類**中將方法定義爲靜態**與定義全局靜態方法不同。在前一種情況下,'static'意味着該方法是一個類方法,並且沒有隱含的'this'指針,而在後者中意味着他隱藏在編譯單元中的方法。 – StoryTeller