Cannot compile betterC app in windows using stderr

Steven Schveighoffer schveiguy at gmail.com
Thu Feb 3 21:56:27 UTC 2022


On 2/3/22 2:55 PM, kinke wrote:
> On Wednesday, 2 February 2022 at 20:58:25 UTC, Walter Bright wrote:
>> On 2/2/2022 4:17 AM, kinke wrote:
>>> On Wednesday, 2 February 2022 at 07:33:58 UTC, Basile B. wrote:
>>>> ```d
>>>> else version (CRuntime_Microsoft)
>>>> {
>>>>     ///
>>>>     shared FILE* stdin;  // = &__iob_func()[0];
>>>>     ///
>>>>     shared FILE* stdout; // = &__iob_func()[1];
>>>>     ///
>>>>     shared FILE* stderr; // = &__iob_func()[2];
>>>> }
>>>> ```
>>>>
>>>> shouldn't these variable declarations be `extern` ?
>>>
>>> Nope, they are macros in the MSVC headers, no symbols are available. 
>>> That's why druntime defines them and sets them up at startup, so they 
>>> aren't available/linked with `-betterC`.
>>
>> The trouble is -betterC does not link with druntime, so it can't find 
>> stderr. The solution is to make stderr a template, so that no linking 
>> with druntime is necessary.
> 
> That's not a solution, but a hack. ;) - With at least 2 major problems:
> 
> * Template culling. If the compiler e.g. sees a stderr instantiation in 
> druntime in the import graph, it may decide not to emit the stderr 
> symbol into the betterC binary, assuming that druntime will be linked 
> anyway.
> * Potentially a DSO-local stderr symbol for each binary (executable or 
> DLL/.so/.dylib), so that changing it in one DSO might not change it for 
> the whole process.
> 
> There have been previous 'dummy-templatizations' in druntime/Phobos to 
> work around missing symbols with -betterC. IMO, that's just patching 
> over the cracks of the -betterC hack and pessimizing regular D, and in 
> case it's not obvious, I'm definitely no fan of this. :)

Since pragma inline works now even without the -inline switch, could an 
inline function take the place of the macro?

-Steve


More information about the Digitalmars-d mailing list