如何防止 Python 2.7 的 <Python.h> 在 SWIG 生成的 Python 包装器中包含 <inttypes.h>?

How to prevent <Python.h> of Python 2.7 from including <inttypes.h> in a Python wrapper generated by SWIG?

我正在开发一个 C++ 库,其中 SWIG 用于生成其 Python 包装器。我的一些 C++ 文件使用 <inittypes.h> 调用 PRId64 和 sprintf 中的其他宏。

我能够在 Scientific Linux 6(RHEL6 克隆)上使用 Python 2.6 和 GCC 4.4.7 编译我的库,但是在 Scientific 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 一起使用?

我在 CXX_FLAGS 中添加了 -D__STDC_FORMAT_MACROS,但正在寻找更好的解决方案(如果存在的话)。

在 SWIG 中,以下代码将行添加到 SWIG 包装器的最顶部,因此它将在 Python.h 之前定义:

%begin %{
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
%}