DMD different compiler behaviour on Linux and Windows
Mike Parker
aldacron at gmail.com
Thu Apr 25 20:38:31 UTC 2019
On Thursday, 25 April 2019 at 20:18:28 UTC, Zans wrote:
> import std.stdio;
>
> void main()
> {
> char[] mychars;
> mychars ~= 'a';
> long index = 0L;
> writeln(mychars[index]);
> }
>
> Why would the code above compile perfectly on Linux (Ubuntu
> 16.04), however it would produce the following error on Windows
> 10:
>
> source\app.d(8,21): Error: cannot implicitly convert expression
> index of type long to uint
>
> On both operating systems DMD version is 2.085.0.
DMD defaults to 64-bit output on 64-Bit Linux but always to
32-bit output on Windows, If you compile with -m32 on Windows the
error goes away. Reasons::
* Array indices are default typed as size_t, which is uint in
32-bit and ulong in 64. long is not implicitly convertible to
uint.
* On Linux, both 64- and 32-bit builds of DMD are available and
the output for each defaults to the same. Only the 32-bit build
is distributed on Windows.
* Historically, compiling 64-bit binaries on Windows required a
separate installation of the Microsoft Build Tools ( or Visual
Studio) and/or the Windows SDK. If 64-bit output were the
default, DMD would not work out of the box. Recently, DMD has
been shipping with the lld linker and some MinGW-based Windows
libraries so that the additional installation is not required and
64-bit compiles can work out of the box, but it’s still
considered experimental.
When out-of-the-box 64-bit compilation is solid and 64-bit builds
are distributed on Windows, the default behavior should be the
same as on Linux.
More information about the Digitalmars-d-learn
mailing list