Interfacing with c and platform dependent sizes

Jacob Carlborg doob at me.com
Sun Feb 27 02:43:52 PST 2011


On 2011-02-26 17:58, simendsjo wrote:
> On 26.02.2011 17:06, Mike Wey wrote:
>> On 02/26/2011 11:49 AM, Jacob Carlborg wrote:
>>> On 2011-02-26 01:28, simendsjo wrote:
>>>> C is not my strong side, so I'm having some problems wrapping some
>>>> code.
>>>>
>>>> I found a couple of sources on this:
>>>> 1) http://www.digitalmars.com/d/2.0/htomodule.html
>>>> 2) http://www.digitalmars.com/d/2.0/interfaceToC.html
>>>>
>>>> 1)
>>>> C's long is the same as D's int.
>>>> long long is long
>>>>
>>>> 2)
>>>> C 32bit's long long is D's long, C 64 bits long is D's long.
>>>>
>>>> So.. A long in C is the same as the platform size? And long long
>>>> doesn't
>>>> exist in 64 bit?
>>>
>>> In general you can follow the table at
>>> http://www.digitalmars.com/d/2.0/htomodule.html
>>>
>>> But when it comes to "long" in C you have to be careful. On 32bit
>>> platforms a C "long" will be 32bit long. But on 64bit platforms it
>>> depends of what data model is used. To simplify things:
>>>
>>> * On Windows 64bit a C "long" will be 32bit long
>>> * On Posix 64bit a C "long" will be 64bit long.
>>>
>>> What you can do is to create an alias called "c_long" and "c_ulong",
>>> something like this:
>>>
>>> version (D_LP64)
>>> {
>>> version (Windows)
>>> {
>>> alias int c_long;
>>> alias uint c_ulong;
>>> }
>>>
>>> else
>>> {
>>> alias long c_long;
>>> alias ulong c_ulong;
>>> }
>>> }
>>>
>>> else
>>> {
>>> alias int c_long;
>>> alias uint c_ulong;
>>> }
>>>
>>> To read more about data models:
>>> http://en.wikipedia.org/wiki/64-bit#Specific_C-language_data_models
>>>
>>
>> You can also import core.stdc.config witch defines both c_long and
>> c_ulong.
>>
> Thanks for all the answers. Is something like this correct?
>
> version(X86_64)
> {
> version(Windows)
> {
> version = LLP64;
> }
> else version(Posix)
> {
> version = LP64;
> }
> else
> {
> static assert(0);
> }
>
> version(LLP64)
> {
> alias short c_short;
> alias ushort c_ushort;
> alias int c_int;
> alias uint c_uint;
> alias int c_long;
> alias uint c_ulong;
> alias long c_longlong;
> alias ulong c_ulonglong;
> alias ulong c_size_t;
> }
> else version(LP64)
> {
> alias short c_short;
> alias ushort c_ushort;
> alias int c_int;
> alias uint c_uint;
> alias long c_long;
> alias ulong c_ulong;
> alias long c_longlong;
> alias ulong c_ulonglong;
> alias ulong c_size_t;
> }
> else version(ILP64)
> {
> alias short c_short;
> alias ushort c_ushort;
> alias long c_int;
> alias ulong c_uint;
> alias long c_long;
> alias ulong c_ulong;
> alias long c_longlong;
> alias ulong c_ulonglong;
> alias ulong c_size_t;
> }
> else version(SILP64)
> {
> alias long c_short;
> alias ulong c_ushort;
> alias long c_int;
> alias ulong c_uint;
> alias long c_long;
> alias ulong c_ulong;
> alias long c_longlong;
> alias ulong c_ulonglong;
> alias ulong c_size_t;
> }
> else
> {
> static assert(0);
> }
> }
> else version(X86)
> {
> alias short c_short;
> alias ushort c_ushort;
> alias int c_int;
> alias uint c_uint;
> alias int c_long;
> alias uint c_ulong;
> alias long c_longlong;
> alias ulong c_ulonglong;
> alias uint c_size_t;
> }
> else
> {
> static assert(0);
> }
>

I suggest you use core.stdc.config instead, I forgot it existed. BTW 
size_t already exists in D (defined in the object module) and it will be 
the same as size_t in C.

-- 
/Jacob Carlborg


More information about the Digitalmars-d-learn mailing list