为什么我需要使用 extern?

3

我正在使用wglGetProcAddress在我的代码中获取GL函数。指南的作者(https://sites.google.com/site/opengltutorialsbyaks/introduction-to-opengl-3-2---tutorial-01)说我需要这样定义函数:

extern PFNGLCREATEPROGRAMPROC glCreateProgram;

使用extern关键字。但我尝试过不使用它也可以(编译成功并且程序成功调用了函数)。通常情况下为什么需要这个关键字以及在这种情况下需要吗?

1个回答

3

extern的作用是告诉编译器所定义的名称在另一个编译单元中。 全局函数定义默认是extern。所以这就解释了为什么在你的情况下它起作用。

必须使用它的地方是定义和声明全局变量。

如果有一个全局变量需要编译单元知道(例如互斥量),则需要在该单元中使其可用。但是,如果您这样做:

int a; // in global scope

编译器试图在程序的静态内存中为其分配内存,并给出重定义错误。在这里,extern能帮助我们解决问题。通过编写以下代码:
extern int a;

我们为全局变量提供了一个声明,但并没有为它分配内存。
不过由于此类全局变量的使用是不被鼓励的,你很少能看到它在使用中。

即使我将这些函数定义为类的静态函数(而不是全局函数),它们仍然起作用。编译器在这种情况下会做什么?为什么我不需要extern? - user14416
@user14416 教程并没有说你需要使用extern,它只是展示了一种使用extern的方法。你已经找到了一种不使用extern的不同方法。这没问题。Dima在上面对extern的解释很好,只是他似乎没有意识到你声明的是全局变量而不是全局函数。 - john
@user14416,C++在很多情况下都会重载static的使用。 在类内定义一个方法为静态的与定义一个全局静态方法并不相同。在前者中,static表示该方法是一个类方法,并且没有隐式的this指针;而在后者中,它表示该方法被隐藏在编译单元中。 - StoryTeller - Unslander Monica
@John,是的,我有点过分强调问题代码示例中的拼写错误了... - StoryTeller - Unslander Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接