Получите SFML кросс-платформенные определения типов в SWIG - PullRequest
2 голосов
/ 01 октября 2011

Я пишу игру на C ++ и связываю ее с Lua .Инструмент, который я выбрал для этой задачи, был SWIG , так как я хочу сделать свою игру доступной для написания на python или другом языке.Я также использую SFML 1.6 в качестве API для мультимедийного доступа.Эта игра также предназначена для кроссплатформенной компиляции.Сейчас я работаю с Xubuntu 11.04 для первой попытки проекта.

Я уже завернул 90% + API SFML в свою игру, но когда я попытался создать новый 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 для межплатформенной разработки, определенные в заголовочном файле <SFML/Config.hpp>.

Теперь в моем файле 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's limits.hЗаголовочный файл содержит некоторый препроцессор , определяющий для размера каждого типа целочисленной переменной.

Моя основная цель - создать эти typedefs в моем SWIG-скрипте, не беспокоясьна какой платформе (или компиляторе) я компилирую свой проект.

Прямо сейчас мой Config.i SWIG-файл выглядит так:

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

%include <SFML/Config.hpp>

И моя SWIG-команда для генерации оболочекis:

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

Я надеялся, что SWIG сможет найти переменные, определенные препроцессором, в файле limits.h, который используется <SFML/Config.hpp>, но я не смог сделать эту работу ...

у вас есть несколько советов о том, как выполнить мою задачу (динамическое определение типов для каждой платформы) или знаете, как заставить swig получить переменные препроцессора, определенные в limits.h?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Благодаря ответу пользователя 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 (на самом деле не уверен насчет версии ... прочитал его где-то и забыл), который готов к использованию.

1 голос
/ 01 октября 2011

Любые типы, определенные в limits.h, не являются стандартными и, вероятно, на них не следует полагаться. Если вам нужны межплатформенные целочисленные определения типа фиксированного размера, стандартная библиотека C ++ 11 предоставляет заголовок cstdint. Этот заголовок дает вам typedefs для 8, 16, 32 и 64-разрядных целых чисел со знаком и без знака: int32_t, uint32_t, int8_t и т. Д.

Большинство реализаций стандартной библиотеки предоставляют cstdint в качестве расширения до C ++ 11, но если ваша реализация не имеет его, Boost также предоставляет его.

...