在SWIG中获取SFML跨平台类型定义

Get SFML cross-platform typedefs in SWIG

本文关键字:跨平台 类型 定义 SFML 获取 SWIG      更新时间:2023-10-16

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

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

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 中定义的预处理器变量的方法?

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

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

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

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

在谷歌上搜索给我带来了这两个网页:

  • [Perl] 一个简单的 typedef 问题 #1
  • [Perl] 一个简单的 typedef 问题 #2

第二个给了我答案。

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

%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 版以来的预定义模块(不太确定版本......在某处阅读并忘记了(准备使用。