Thread overview |
---|
October 17, 2020 Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
I have inherited an open source C project that assumes that the size of a long and the size of a pointer are the same, and I have translated it into very similar D just like https://dlang.org/blog/2018/06/11/dasbetterc-converting-make-c-to-d/ D has the size of long fixed at 64 bits, so a pointer now has to be 64 bits. So I want to put something into the source to ensure an attempt to make a 32 bit build fails. What is the best way to do this? |
October 17, 2020 Re: Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
Posted in reply to NonNull | On Saturday, 17 October 2020 at 14:50:47 UTC, NonNull wrote: > I have inherited an open source C project that assumes that the size of a long and the size of a pointer are the same, and I have translated it into very similar D just like https://dlang.org/blog/2018/06/11/dasbetterc-converting-make-c-to-d/ > > D has the size of long fixed at 64 bits, so a pointer now has to be 64 bits. No it's wrong. A pointer always has the size of a general purpose register. > So I want to put something into the source to ensure an attempt to make a 32 bit build fails. What is the best way to do this? anyway you have several options: --- version(X86) static assert (false, "not for i386"); --- or --- static assert (size_t.sizeof != 4, "blablalala"); --- |
October 17, 2020 Re: Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
Posted in reply to NonNull | On Saturday, 17 October 2020 at 14:50:47 UTC, NonNull wrote:
> I have inherited an open source C project that assumes that the size of a long and the size of a pointer are the same
static assert(long.sizeof == void*.sizeof);
|
October 17, 2020 Re: Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Basile B. | On Saturday, 17 October 2020 at 14:56:33 UTC, Basile B. wrote:
> On Saturday, 17 October 2020 at 14:50:47 UTC, NonNull wrote:
>> I have inherited an open source C project that assumes that the size of a long and the size of a pointer are the same, and I have translated it into very similar D just like https://dlang.org/blog/2018/06/11/dasbetterc-converting-make-c-to-d/
>>
>> D has the size of long fixed at 64 bits, so a pointer now has to be 64 bits.
>
> No it's wrong. A pointer always has the size of a general purpose register.
You misunderstand. The original C only works if the size of a pointer is the same as the size of a long. So when translated into D in a simple way where the size of a long is always 64 bits the D will only work if the size of a pointer is 64 bits.
|
October 17, 2020 Re: Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
Posted in reply to NonNull | On Saturday, 17 October 2020 at 14:50:47 UTC, NonNull wrote:
> I have inherited an open source C project that assumes that the size of a long and the size of a pointer are the same, and I have translated it into very similar D just like https://dlang.org/blog/2018/06/11/dasbetterc-converting-make-c-to-d/
>
> D has the size of long fixed at 64 bits, so a pointer now has to be 64 bits.
If you want to exactly match the original C code's semantics, I suggest translating (unsigned) long with c_long or c_ulong. You can import them here:
```
import core.stdc.config: c_long, c_ulong;
```
Then you could add this:
```
static assert(c_long.sizeof == size_t.sizeof);
```
This will fail on Windows 64 bit, where C longs are 32-bit and pointers 64-bit.
|
October 17, 2020 Re: Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Saturday, 17 October 2020 at 14:56:35 UTC, Adam D. Ruppe wrote:
> On Saturday, 17 October 2020 at 14:50:47 UTC, NonNull wrote:
>> I have inherited an open source C project that assumes that the size of a long and the size of a pointer are the same
>
> static assert(long.sizeof == void*.sizeof);
That's a nice clean answer!
|
October 17, 2020 Re: Best way to confine project to 64 bit builds only? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dennis | On Saturday, 17 October 2020 at 15:03:29 UTC, Dennis wrote:
> If you want to exactly match the original C code's semantics, I suggest translating (unsigned) long with c_long or c_ulong. You can import them here:
> ```
> import core.stdc.config: c_long, c_ulong;
> ```
>
> Then you could add this:
> ```
> static assert(c_long.sizeof == size_t.sizeof);
> ```
>
> This will fail on Windows 64 bit, where C longs are 32-bit and pointers 64-bit.
That is useful information in general, I did not know about core.stdc.config and it is useful in future projects!
But for my project the C works at 64 bits except on Windows for the reason you gave. So by translating long in C to long in D it loses 32 bits but gains 64 bits on Windows. This is what I want.
|
Copyright © 1999-2021 by the D Language Foundation