[erlang-questions] strange definition of enif_get_uint64

Per Hedeland per@REDACTED
Thu Aug 29 18:58:37 CEST 2019

On 2019-08-29 10:34, Caragea Silviu wrote:
> But why not just using they definitions from stdint.h on platforms where this one exists ?

+1. I guess the reason is historical, from back when stdint.h (part of
the C99 standard AFAIK) wasn't widely avaible or at least known, and
instead these 'configure'-based "private" typedefs were used. But
these days I really wonder if anyone is running Erlang on a platform
that doesn't have stdint.h.

> Idea is that the way is right now creates lot of conversions warnings if using NIF in mix with other libs that respects the <stdint.h> standard. And I need to put lot of casts to avoid them

Another problem is with cross compilation - in a native build,
'configure' can reliably determine the correct typedefs by running
sizeof()-tests, but for a cross build, the user has to tell it, and
had better get it right.

In fact just the other week I came across someone having ended up with
ErlNifUInt64 being an "unsigned long" in a cross build for a 32-bit
system, i.e. only 32 bits (perhaps whoever was to blame had done a
manual sizeof() test on the 64-bit build system).

Using stdint.h "just works" in my experience, both for portability (no
need for 'configure' for *that* at least) and for cross builds - it
would really be an improvement.


> Silviu
> On Thu, Aug 29, 2019 at 10:40 AM Mikael Pettersson <mikpelinux@REDACTED <mailto:mikpelinux@REDACTED>> wrote:
>     On Wed, Aug 28, 2019 at 11:30 PM Caragea Silviu <silviu.cpp@REDACTED <mailto:silviu.cpp@REDACTED>> wrote:
>      >
>      > Hello,
>      >
>      > On a Mac OS 10.13.6 x64 in the osx headers the uint_64_t is defined as:
>      >
>      > #ifndef _UINT64_T
>      > #define _UINT64_T
>      > typedef unsigned long long uint64_t;
>      > #endif /* _UINT64_T */
>      >
>      > But NIF function enif_get_uint64 is defined as
>      >
>      > #  define enif_get_uint64 enif_get_ulong
>      >
>      > which accepts an unsigned long
>      >
>      > Any idea why is like this ?
>     The definitiion of enif_get_uint64 is conditional on the size of C's
>     long type; the case you quoted only applies when long _is_ 64 bits.
>     (Typically long is 32 bits on 32-bit machines and 64 bits on 64-bit
>     machines, with long long always being 64 bits, but some OS:es
>     (Windows) insists on keeping long 32 bits even in 64-bit environments.
>     This is just one of many small details we have to handle when writing
>     C code that's supposed to work on many CPUs and OS:es.)
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

More information about the erlang-questions mailing list