/ / Perché Python.h di python 3.2 deve essere incluso come prima insieme a Qt4 - c ++, python, qt

Perché Python.h di python 3.2 deve essere incluso come prima insieme a Qt4 - c ++, python, qt

Ho un'applicazione qt e voglio implementarlainterprete Python in modo che io possa estenderlo con gli script Python. Anche se questo funziona bene per le normali applicazioni C ++, incluso Python.h anche per la maggior parte del semplice, vuoto progetto Qt4 risulta sempre in:

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

L'ho implementato solo nel mio file .pro:

INCLUDEPATH + = "/usr/include/python3.2"

ora quando lo faccio

#include <Python.h>

in qualsiasi file .h lo rende indivisibile. Perché?

Nota: tutto funziona perfettamente con python 2.7, solo python 3x non funziona

EDIT: Ho capito che quando includo Python.h come primo file, prima che Qt includesse, funziona, questo è un bug in Python? Mancano alcune guardie sicure?

risposte:

2 per risposta № 1

Il documentazione degli stati C-API Python:

Nota Poiché Python può definire alcune definizioni di pre-processore che influenzano le intestazioni standard su alcuni sistemi, è necessario includere Python.h prima di includere qualsiasi intestazione standard.

È molto probabile che alcune intestazioni di Qt includano intestazioni standard (come evidente dall'errore che si ottiene, include /usr/include/features.ho esempio), quindi #include <Python.h> deve essere posizionato prima delle intestazioni Qt. Di fatto, dovrebbe essere generalmente posizionato prima di ogni altra dichiarazione di inclusione.

Si noti che questo è il caso anche con Python 2.7. Se un diverso ordine di inclusione funziona per te con Python 2.7, allora sei semplicemente fortunato.