我正在编写一个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
中定义的预处理器变量?
答案 0 :(得分:1)
limits.h
中定义的任何类型都不是标准的,可能不应该依赖。如果需要跨平台固定大小的整数typedef,则C ++ 11标准库提供cstdint
标头。此标头为您提供有符号和无符号8,16,32和64位整数的typedef:int32_t
,uint32_t
,int8_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(不确定版本...在某处读取并忘记了)已准备好使用。