You could also use a [FloatingType] declaration and not mess with
pre-processor directives.

[FloatingType]
public struct dReal {}

2016-12-05 7:20 GMT-05:00 Al Thomas via vala-list <vala-list@gnome.org>:

> > ----- Original Message -----
>
> > From: Daniel Brendle <grindh...@skarphed.org>
> > Sent: Monday, 5 December 2016, 7:53
> > Subject: [Vala] VAPI-Bindings to obscure c-types.
>
> > In libode's code, there is a type called dReal. Depending on some
> > compiler flags, dReal might be a double or a float:
>
> > #if defined(dSINGLE)
> > typedef float dReal;
> > #ifdef dDOUBLE
> > #error You can only #define dSINGLE or dDOUBLE, not both.
> > #endif /* dDOUBLE */
> > #elif defined(dDOUBLE)
> > typedef double dReal;
> > #else
> > #error You must #define dSINGLE or dDOUBLE
> > #endif
>
> > The library then uses dReal in various method signatures that I have to
>
> > bind against. Is there any possibility to cover this in vala?
>
>
> These are macros that are defined without a value and are used by the C
> pre-processor. To define such a macro from valac, as you probably know, you
> use the -X option:
> valac --pkg libode6 -X -DdDOUBLE example.vala
>
> Vala has a similiar, but much simpler, pre-processor:
> https://wiki.gnome.org/Projects/Vala/Manual/Preprocessor
> https://wiki.gnome.org/Projects/Vala/ConditionalCompilationSample
>
> The Vala pre-processor can also be used in a VAPI file:
> #if ODE_FLOAT
>   [SimpleType]
>
>   [CCode (cname = "dReal", has_type_id = false)]
>   public struct dReal : float {
>   }
> #else
>   [SimpleType]
>   [CCode (cname = "dReal", has_type_id = false)]
>   public struct dReal : double {
>   }
> #endif
>
> So for double you would compile with:
> valac --pkg libode6 -X -DdDOUBLE example.vala
>
>
> and for float:
> valac --pkg libode6 -X -DdSINGLE -D ODE_FLOAT example.vala
>
> You will have to use separate declarations for both the C pre-processor
> and the Vala pre-processor. While you can define a macro in a .vala file by
> using const, this cannot currently be emitted before the #include in the
> generated C file. So it is not set at the time when the C header is
> processed.
>
> This is untested and probably doesn't reflect your binding, but should
> convey the method.
>
> Al
> _______________________________________________
> vala-list mailing list
> vala-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/vala-list
>



-- 
Guillaume Poirier-Morency <guillaumepoiriermore...@gmail.com>

Étudiant au baccalauréat en Informatique à l'Université de Montréal
Développeur d'application web

*Mon blog:* arteymix.github.io
*Mon projet de coopérative:* pittoresque.github.io
*Clé PGP:* B1AD6EA5
<https://pgp.mit.edu/pks/lookup?op=vindex&search=0x1CCFC3A2B1AD6EA5>
_______________________________________________
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to