Я разрабатываю библиотеку C++, в которой SWIG используется для создания своей оболочки Python. Некоторые из моих файлов на C++ используют <inittypes.h>
для вызова PRId64 и других макросов в sprintf.Как предотвратить <Python.h> из Python 2.7 из <inttypes.h> в оболочке Python, созданной SWIG?
Я смог скомпилировать мою библиотеку с Python 2.6 и GCC 4.4.7 на Scientific Linux 6 (клон RHEL6), но Python 2.7 и GCC 4.8.2 на Scientific Linux 7 (клон RHEL7) вызвали много ошибок, как показано ниже.
/home/oxon/libTARGET/inc/target/T2EvalBoard.h:562:145: warning: too many arguments for format [-Wformat-extra-args]
In file included from /home/oxon/libTARGET_build/src/targetPYTHON_wrap.cxx:3117:0:
/home/oxon/libTARGET/inc/target/BaseCameraModule.h: In member function ‘virtual void TARGET::BaseCameraModule::ReceiveEvent(uint32_t&, uint8_t**)’:
/home/oxon/libTARGET/inc/target/BaseCameraModule.h:211:66: error: expected ‘)’ before ‘PRIu32’
sprintf(str, "Cannot read event data. Requested length is %" PRIu32 " bytes, but only %" PRId64 " bytes were read.", length, fBytesReturned);
Я знаю, что я должен добавить следующие строки в файлы заголовков первого для того, чтобы использовать PRId64
и другие.
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
Но targetPYTHON_wrap.cxx
, что исходный файл, созданный с помощью SWIG, включает <Python.h>
в начале файла, и поэтому приведенные выше строки игнорируются. В самом деле, следующий код не может быть скомпилирован, поскольку <Python.h>
включает в себя <inttypes.h>
.
#include <Python.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <stdio.h>
int main()
{
printf("Output: " PRIu32 "\n", 100);
return 0;
}
Как использовать PRId64
и другие макросы с <Python.h>
и SWIG?