Thread overview
C's void func() vs. void func(void).
Jul 29, 2016
ciechowoj
Jul 29, 2016
Mike Parker
Jul 29, 2016
Mike Parker
Jul 29, 2016
ciechowoj
Jul 29, 2016
ag0aep6g
Jul 30, 2016
Mike Parker
July 29, 2016
In C, a function `void func()` doesn't declare a function without arguments, instead it declares a function that takes unspecified number of arguments. The correct way to declare a function that takes no arguments is to use the `void` keyword: `void func(void)`.

What is the correct way to refer to such a function (`void func()`) from D bindings?

If I assume that the unspecified number of arguments (for some particular function) is equal to zero, is `extern (C) void func()` a correct D binding to the both functions `void func()` and `void func(void)` declared in C?

Specifically, I'm concerned about calling convention issues.
July 29, 2016
On Friday, 29 July 2016 at 10:57:37 UTC, ciechowoj wrote:
> In C, a function `void func()` doesn't declare a function without arguments, instead it declares a function that takes unspecified number of arguments. The correct way to declare a function that takes no arguments is to use the `void` keyword: `void func(void)`.
>
> What is the correct way to refer to such a function (`void func()`) from D bindings?
>
> If I assume that the unspecified number of arguments (for some particular function) is equal to zero, is `extern (C) void func()` a correct D binding to the both functions `void func()` and `void func(void)` declared in C?
>
> Specifically, I'm concerned about calling convention issues.

Yes, this is correct as long as the calling convention is not stdcall or something else:

extern(C) void func();

If you're dealing with stdcall:

extern(Windows) void func();

And if it is a cross-platform library that is stdcall on Windows and cdecl elsewhere:

extern(C) void fun();
July 29, 2016
On Friday, 29 July 2016 at 12:15:22 UTC, Mike Parker wrote:

>
> Yes, this is correct as long as the calling convention is not stdcall or something else:

Though, I should add the caveat that you need to ensure the definition of the C function does not specify any parameters. AFAIK, this is legal:

// foo.h
void func();

// foo.c
void func(int a, int b) { ... }

In which case you would want to include the parameters in your binding.


July 29, 2016
On Friday, 29 July 2016 at 12:20:17 UTC, Mike Parker wrote:
>
> Though, I should add the caveat that you need to ensure the definition of the C function does not specify any parameters. AFAIK, this is legal:
>
> // foo.h
> void func();
>
> // foo.c
> void func(int a, int b) { ... }
>
> In which case you would want to include the parameters in your binding.

Thanks, good to know.
July 29, 2016
On 07/29/2016 02:15 PM, Mike Parker wrote:
> And if it is a cross-platform library that is stdcall on Windows and
> cdecl elsewhere:
>
> extern(C) void fun();

extern(System), no?
July 30, 2016
On Friday, 29 July 2016 at 18:24:52 UTC, ag0aep6g wrote:
> On 07/29/2016 02:15 PM, Mike Parker wrote:
>> And if it is a cross-platform library that is stdcall on Windows and
>> cdecl elsewhere:
>>
>> extern(C) void fun();
>
> extern(System), no?

Yeah, that's what I had intended.