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

标签 c++ c-preprocessor swig sfml

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

我已经在我的游戏中封装了 90% 以上的 SFML API,但是当我尝试创建一个新的 sf::Color 时我的 Lua 脚本中的对象(以便我可以调用 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

...当我在另一个平台上编译我的项目时,我可以只写这些 typedefs 参加这个新平台,但我发现 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 中定义的任何类型都不是标准的,可能不应依赖。如果您想要跨平台的固定大小整数类型定义,C++11 标准库提供了 cstdint header 。此 header 为您提供有符号和无符号 8、16、32 和 64 位整数的类型定义:int32_tuint32_tint8_t 等上。

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

关于c++ - 在 SWIG 中获取 SFML 跨平台类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616132/

相关文章:

c++ - 将#elif 与#ifdef 一起使用是否合法?

c++ - C/C++ 行号

java - 配置 SWIG 以使用 int32_t 输出参数为 C 函数创建适当的 Java 数据类型

c++ - SWIG 包装的 vector vector (C++ 到 python)——如何将内部 vector 识别为代理对象?

c++ - 运算符 '==' 没有左操作数

c++ - 需要接受教育 : declaration ‘void encrypt(char*, int)’ has a different exception specifier'

c - 文件夹分隔符 windows 和 unix 的 ANSI C 定义

c++ - 带有 SWIG 包装类型的 Python 回调

c++ - C-LinkedList Append Function, with Bad Memory Address 错误

c++ - 计算 alglib::real_1d_array 中元素总和的奇怪错误