Interfacing with c and platform dependent sizes

simendsjo simen.endsjo at pandavre.com
Sat Feb 26 08:58:30 PST 2011


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);
}



More information about the Digitalmars-d-learn mailing list