2012-09-15 84 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