在SWIG中获取SFML跨平台typedef

时间:2011-09-30 21:10:59

标签: c++ c-preprocessor swig sfml

我正在编写一个C ++游戏,我将它与Lua连接起来。我为此任务选择的工具是SWIG,因为我想让我的游戏可以用python或其他语言编写。我也使用SFML 1.6作为多媒体访问的API。此游戏也可用于跨平台编译。我正在使用Xubuntu 11.04进行该项目的第一次尝试。

我已经在我的游戏中包含了90%以上的SFML API,但当我尝试在我的Lua脚本中创建一个新的sf::Color对象时(这样我就可以调用sf::RenderWindow::Clear(sf::Color)方法),我的Lua Script指责这个电话......

renderWindow:Clear( sf.Color( 200, 0, 0 ) ) --Fill the screen with the color.

...试图调用方法sf:Color( Uint8, Uint8, Uint8 );此警告提醒我,SWIG无法识别<SFML/Config.hpp>头文件中定义的跨平台开发的SFML特殊typedef整数。

现在,在我的SWIG Config.i文件中,我可以简单地写一下......

typedef unsigned char Uint8; //Always correct
typedef unsigned short int Uint16; //Not always true
typedef unsigned int Uint32; //Not always true

...当在另一个平台上编译我的项目时,我可以写这些 typedef 参与这个新平台,但我发现c的limits.h头文件包含一些预处理器定义表示每种整数变量的大小。

我的主要目的是在我的SWIG脚本中创建这些 typedef ,而不必担心我正在编译我的项目的平台(或编译器)。

现在,我的Config.i SWIG文件如下所示:

%{
#include <limits.h>
#include <climits.h>
#include <SFML/Config.hpp>
%}

%include <SFML/Config.hpp>

我生成包装器的SWIG命令是:

swig -c++ -lua -I/PathToSFML -I/PathToLimits ./SFML.i

我希望SWIG可以在limits.h文件中找到预处理器定义的变量,<SFML/Config.hpp>使用该变量,但我无法使其工作......

有没有人有关于如何实现我的目标的提示(每个平台的动态类型定义)或者知道如何让swig获得limits.h中定义的预处理器变量?

2 个答案:

答案 0 :(得分:1)

limits.h中定义的任何类型都不是标准的,可能不应该依赖。如果需要跨平台固定大小的整数typedef,则C ++ 11标准库提供cstdint标头。此标头为您提供有符号和无符号8,16,32和64位整数的typedef:int32_tuint32_tint8_t,等等。

大多数标准库实现在C ++ 11之前提供了cstdint作为扩展,但如果你的实现没有它,Boost也会提供它。

答案 1 :(得分:1)

感谢用户dauphic的回答,我尝试在我的示例中使用<stdint.h>,然后在我的模块中运行SWIG时收到此错误消息:

/usr/include/stdint.h:44: Error: Syntax error in input(1).

在Google上搜索产生了这两个网页:

第二个给了我答案。

我的最终代码现在看起来像这样:

%module Config

%include <stdint.i>

//namespace sf // For some reason, not working when the namespace is here...
//{            // Turns out that I don't need the sf anyway...
typedef int8_t Int8;
typedef uint8_t Uint8;

typedef int16_t Int16;
typedef uint16_t Uint16;

typedef uint32_t Int32;
typedef uint32_t Uint32;
//}

正如您所看到的,%include <stdint.i>是SWIG中预定义的模块,因为版本1.34(不确定版本...在某处读取并忘记了)已准备好使用。