On 1/28/15 2:49 AM, Walter Bright wrote:
On 1/27/2015 11:22 PM, Jacob Carlborg wrote:
On 2015-01-27 21:31, Steven Schveighoffer wrote:

For instance, if one library tags it as pure, but another does not. I
think an error in that case is warranted.

Yeah. Do the compiler need to look at the parameters as well? Even if
you put
const or immutable, it won't make difference on the C side. But it
will probably
be confusing if one is declared const and another is not.


C does not have name mangling, so:

   extern(C) void foo(int);
   extern(C) void foo(char);

will mangle to the same name, although D will regard them as different
symbols. C++ treats extern"C" names the same way.

Hah! so this actually makes me more convinced we should do it differently:

cfile.c
#include <stdio.h>
void cfunction() {printf("hello\n");}

file1.d
module file1;
extern(C) void cfunction(int);

file2.d
module file2;
extern(C) void cfunction(const char *);

main.d
import file1;
import file2;

void main()
{
   cfunction(1);
   cfunction("1");
}

This works, and prints "hello" twice.

I really think D should consider extern(C) functions as not overloadable, and universally binding (i.e. it's not an error to have 2 identical definitions in separate modules, and it is an error to have 2 different overloads of an extern(C) fucntion). Is there a good reason to do it the current way besides "that's what C++ does"?

-Steve

Reply via email to