在SWIG中获取SFML跨平台类型定义
Get SFML cross-platform typedefs in SWIG
我正在编写一个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_t
、uint32_t
、int8_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 版以来的预定义模块(不太确定版本......在某处阅读并忘记了(准备使用。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何定义自定义跨平台size_t类型
- 在转换为较小的数值类型之前执行范围检查的安全、跨平台方法是什么
- 跨平台方式获取用户友好的文件类型描述
- DLL项目应该是跨平台使用的类型
- 我必须使用OpenGL数据类型(GLint,CLchar,..)进行跨平台游戏吗
- 是否有跨平台(x86和x64)PInvoke和windows数据类型的明确指南
- 在SWIG中获取SFML跨平台类型定义
- 如何使用跨平台方法确定驱动器类型
- Google的Protocol Buffer在实践中对浮点类型的处理有多跨平台?
- 设计跨平台多内容类型文件格式的最佳方法
- 是C++中跨平台的枚举类型