我试图理解为什么这个程序将在C中编译而不是C++,为什么extern "C" { }似乎没有帮助.
这个简短的程序实际上并没有做任何事情,但是通过例子说明编译时C和C++之间存在差异.
#include <GL/gl.h>
int main() {
glBegin(GL_POLYGON);
glUseProgram(0);
glEnd();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当你将它保存为ex.c并用gcc ex.c -lGL -o ex它编译它时,按预期编译和链接.
当您将其保存为ex.cpp并使用它编译时gcc ex.cpp -lGL -o ex会出现编译器错误:
error: ‘glUseProgram’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
请注意,它不会抱怨glBegin,glEnd或GL_POLYGON.实际上,你可以注释掉glUseProgram行,它可以编译为cpp程序.
现在,为什么我不能这样包装程序extern "C":
extern "C" {
#include <GL/gl.h>
int main() {
glBegin(GL_POLYGON);
glUseProgram(0);
glEnd();
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
这样做仍会导致相同的编译器错误.我的理解extern "C"是不完整的.
最终我需要理解什么是错误的,因为我正在尝试编写一个C++程序,该程序使用许多显然不会在C++中编译的GL函数.
如何在C++程序中使用gl.h?
为了解决一些评论:我在X11上使用Mesa.glUseProgram定义在glext.h中,它通过gl.h包含在内.我已经在raspi上使用OpenGL(实际上是GLES)编写了一个C++程序.将它转换为X11证明是一件非常重要的事情.
正如我所评论的那样,#define GL_GLEXT_PROTOTYPES在include指令之前放置可以解决您的问题.
通常,原型存在于头文件中,但由于条件编译而不可见.要定义原型和typedef,应用程序必须在包含gl.h或glx.h之前#define GL_GLEXT_PROTOTYPES.(注意:一致性建议使用GLX_GLXEXT_PROTOTYPES用于glxext.h - TBD).
这通常是通过像完成GLUT或GLEW在他们的头文件,所以如果你与他们共事它通常不是需要定义的宏自己-但一定要包括他们的头部之前的GL/gl.h
编辑:glBegin在出现问题的情况下工作正常的原因glUseProgram是glBeginOpenGL的第一个草稿虽然glUseProgram是一个扩展,但在OpenGL 2.0之前还没有引入.
编辑:
让我们更具体一点:为什么它适用于C但不适用于C++?首先,GL_GLEXT_PROTOTYPESC或C++版本都没有定义.您可以使用以下代码来测试它:
#ifdef GL_GLEXT_PROTOTYPES
puts("macro detected");
#endif
Run Code Online (Sandbox Code Playgroud)
然而,原因是在C中允许函数的符号完全没有定义(假设它的所有参数都是int并且也返回一个int),而在C++中它是不允许的.
| 归档时间: |
|
| 查看次数: |
3138 次 |
| 最近记录: |