core.stdc and betterC

rikki cattermole rikki at cattermole.co.nz
Sun Apr 29 14:55:06 UTC 2018


On 30/04/2018 2:42 AM, dd886k wrote:
> Hello!
> 
> This is my first time posting, so do feel free to correct me and this post.
> 
> I started writing in D around Q2 2017 and recently been re-writing some 
> of my projects as betterC (entirely!).
> 
> I noticed something weird. It started with DMD 2.074.0 and it's still an 
> issue for me in DMD 2.079.1 (and any other compiler really).
> 
> Consider this piece:
> 
> ```
> import core.stdc.stdio;
> 
> extern(C) void main() {
>      printf("a");
> }
> ```
> 
> It compiles and runs absolutely wonderful (OMF, MSCOFF, ELF, etc.). No 
> issues.
> 
> Now consider this piece:
> 
> ```
> import core.stdc.stdio;
> 
> extern(C) void main() {
>      putchar('a');
> }
> ```
> 
> Oops, `Error 42: Symbol Undefined 
> __D4core4stdc5stdio7putcharFNbNiNeiZi`! To my surprise, `putchar` is 
> extern'd as D in druntime/src/core/stdc/stdio.d, and I find that _really 
> silly_.
> 
> Which means `putchar`, during linking, is affected for linking every 
> single C runtime out there, and the only reason I can think of is to 
> easily integrate it with D in general, which in my opinion, is not 
> necessarily needed since the D people (not meant as an insult) promotes 
> betterC as a stand-alone option.
> 
> On Windows, stdin, stdout, and stderr are affected when using -m32mscoff 
> and -m64 (and obviously, LDC) because under CRuntime_Microsoft, std* are 
> defined as `shared`.
> 
> I'm aware that an easy solution would be defining a version (D_betterC) 
> section.
> 
> Will I do a Pull Request? Unfortunately no, I fear I'll abandon mid-way 
> through. It's easier to advise the forums and let an actual professional 
> integrate the fix.
> 
> If you have other suggestions, I'm all ears.

Welcome.

I just checked, extern(D) isn't at fault. You actually do want name 
mangling for wrapper functions like that.

Did you only -I the file? If you compile it in normally, it won't error 
out. Normally its compiled into druntime and hence Phobos.

We really should have functions like this be templated (empty brackets) 
so that it'll work with just -I happily.


More information about the Digitalmars-d mailing list