C++ #包括<;windows.h>;导致许多语法错误
我的程序使用Qt和OpenGL。它可以在Linux和Mac下正确编译。 在windows上编译时,我需要#包括windows.h以使用OpenGL,代码如下:C++ #包括<;windows.h>;导致许多语法错误,c++,windows,qt,opengl,C++,Windows,Qt,Opengl,我的程序使用Qt和OpenGL。它可以在Linux和Mac下正确编译。 在windows上编译时,我需要#包括windows.h以使用OpenGL,代码如下: #if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64) #include <windows.h> #endif #ifdef __APPLE__ #include <OpenGL/glu.h> #include <G
#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64)
#include <windows.h>
#endif
#ifdef __APPLE__
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#else
#include <GL/glu.h>
#include <GL/glut.h>
#endif
如果我不包括windows.h,那么这些错误就不会出现。
我正在将VS2013与Qt 5.3一起使用。
windows.h
用大量错误、矩形
解决这个问题的一种方法是自己声明所需的函数(我想这不是太复杂的工作,因为您不需要超过10个函数)。您可以调用include文件wgl.h
或其他什么
__declspec(dllimport) void* __stdcall wglCreateContext(void* hdc);
//... Other functions you need
OpenGL API是在
windows.h
之外定义的,因此没有问题windows.h
用大量错误、矩形
解决这个问题的一种方法是自己声明所需的函数(我想这不是太复杂的工作,因为您不需要超过10个函数)。您可以调用include文件wgl.h
或其他什么
__declspec(dllimport) void* __stdcall wglCreateContext(void* hdc);
//... Other functions you need
OpenGL API是在windows.h
之外定义的,因此微软windows上的OpenGL与WGL绑定,WGL又与GDI绑定。
因此,如果不首先包含一些定义GDI/Windows预处理器令牌的特定于Windows的头,例如wingdipi
和apitery
,就不能#include
(通过包含
间接实现此目的)。但这实际上是Windows上的任何OpenGL程序与任何特定于Windows的程序绑定的程度(按页眉)
WinDef.h
定义了apitery
和WinGDI.h
定义了wingdipi
——包括Windows.h
会带来这两个标题(以及许多其他垃圾)。因此,包括Windows.h
主要是一种方便;要想在Windows上编译OpenGL软件,您应该#include
,然后是#include
,最后是#include
或者,您可以在#include
之前定义WIN32_LEAN_并_MEAN,它将通过包含该标题显著减少引入的不相关内容的数量。许多VisualC++项目实际上在创建它们时默认地定义了预处理器定义,您可能想查看项目是否配置为这样。微软Windows上的“/P>”OpenGL与WGL绑定,WGL又与GDI绑定。
因此,如果不首先包含一些定义GDI/Windows预处理器令牌的特定于Windows的头,例如wingdipi
和apitery
,就不能#include
(通过包含
间接实现此目的)。但这实际上是Windows上的任何OpenGL程序与任何特定于Windows的程序绑定的程度(按页眉)
WinDef.h
定义了apitery
和WinGDI.h
定义了wingdipi
——包括Windows.h
会带来这两个标题(以及许多其他垃圾)。因此,包括Windows.h
主要是一种方便;要想在Windows上编译OpenGL软件,您应该#include
,然后是#include
,最后是#include
或者,您可以在
#include
之前定义WIN32_LEAN_并_MEAN,它将通过包含该标题显著减少引入的不相关内容的数量。许多VisualC++项目实际上在首次创建时默认定义了预处理器定义,您可能想查看项目是否配置为这样。可能是相关的:如果您需要在GL中插入,为什么不只是<代码> >包含< /代码>?还请注意,GL!=过量。我试过了,如果定义NOMINMAX,包括,否则,定义NOMINMAX,包括,取消定义NOMINMAX,如果在,问题仍然存在,我的程序使用了一些过量函数,这就是为什么我包括了过量。h@peppe:#include
间接包括
。我认为依靠这一点是不好的,但这正是OP目前摆脱困境的方式。此外,还有一些GLUT函数与上下文管理无关,因此它有时对我们Qt和GLUT一起使用是有意义的。我猜这里就是这种情况。可能是相关的:如果你需要拉总账,为什么不把它包括进去呢?还请注意,GL!=过量。我试过了,如果定义NOMINMAX,包括,否则,定义NOMINMAX,包括,取消定义NOMINMAX,如果在,问题仍然存在,我的程序使用了一些过量函数,这就是为什么我包括了过量。h@peppe:#include
间接包括
。我认为依靠这一点是不好的,但这正是OP目前摆脱困境的方式。此外,还有一些GLUT函数与上下文管理无关,因此它有时对我们Qt和GLUT一起使用是有意义的。我猜这里就是这种情况。#定义WIN32#LEAN#和#你的意思是在#包含解决我的问题之前。我还需要#在包含之前包含#在包含之前包含,否则它会说“退出”功能的定义存在冲突,是的。第二个问题记录在关于堆栈溢出的其他几个问题中,显然是在VisualStudio2005(8.0)前后出现的,但是由于GLUT从未更新,所以您必须自己解决它。谢谢。我不能让glfw、glew和ENet一起玩得很好。。。最后发现这是因为ENet需要windows.h,这会根据包含顺序影响glfw。。。但不知道如何避免包含它。设置WIN32\u LEAN\u和\u MEAN,然后包括windows.h、enet、glew和glfw,最后成功了。FWIW,我在一些例子中得到了“error:expected identifier or'('before numeric constant)”