C++ 为什么Python3.2中的Python.h必须作为第一个与Qt4一起包含

C++ 为什么Python3.2中的Python.h必须作为第一个与Qt4一起包含,c++,python,qt,C++,Python,Qt,我有一个qt应用程序,我想在其中实现python解释器,以便用python脚本扩展它。虽然对于普通C++应用程序来说,这很好,但对于大多数简单的空QT4项目,空QT4项目总是导致: g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/Qt

我有一个qt应用程序,我想在其中实现python解释器,以便用python脚本扩展它。虽然对于普通C++应用程序来说,这很好,但对于大多数简单的空QT4项目,空QT4项目总是导致:

g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I/usr/include/python3.2mu -I. -o main.o main.cpp
In file included from /usr/include/python3.2mu/Python.h:8:0,
                 from main.cpp:16:
/usr/include/python3.2mu/pyconfig.h:1182:0: warning: "_POSIX_C_SOURCE" redefined [enabled by default]
/usr/include/features.h:164:0: note: this is the location of the previous definition
/usr/include/python3.2mu/pyconfig.h:1204:0: warning: "_XOPEN_SOURCE" redefined [enabled by default]
/usr/include/features.h:166:0: note: this is the location of the previous definition
In file included from /usr/include/python3.2mu/Python.h:67:0,
                 from main.cpp:16:
/usr/include/python3.2mu/object.h:402:23: error: expected unqualified-id before ‘;’ token
make: *** [main.o] Error 1
我仅在.pro文件中实现了此功能:

INCLUDEPATH+=“/usr/include/python3.2”

现在只要我愿意

#include <Python.h>
#包括
在任何.h文件中,它都使其无法构建。为什么呢

注意:这一切在Python2.7中都能完美运行,只是Python3x不起作用

编辑:我发现,当我将Python.h作为第一个文件包含在Qt包含之前时,它就工作了,这是Python中的一个bug吗?它们是否缺少一些安全防护装置?

Python C-API的状态如下:

注意由于Python可能会定义一些影响某些系统上标准头的预处理器定义,因此必须在包含任何标准头之前包含Python.h

很可能某些Qt头包含标准头(从您得到的错误中可以明显看出,它确实包含
/usr/include/features.h
,或示例),因此
#include
应该放在Qt头之前。事实上,它通常应该放在任何其他include语句之前


请注意,Python 2.7也是如此。如果在Python 2.7中使用不同的包含顺序对您有效,那么您就是幸运的。

这听起来非常自私,如果每个开发人员都这样想,那么我们不能使用超过一个外部库,因为它们都需要首先被包含。为什么他们不捍卫这一点?@Petr我最终不知道答案,我不是说这个。但有一件事需要记住,他们并不是简单地故意制造名称冲突。我相信,上面的文字的意思是,它们故意影响某些标准标题,这是不正确的。相反,他们应该要求用户在包含Python.h之前将相关的
\XOPEN\u SOURCE
\POSIX\u SOURCE
宏定义为足够的值,而不是重新定义它们。