Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
July 29, 2016 C's void func() vs. void func(void). | ||||
---|---|---|---|---|
| ||||
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 Re: C's void func() vs. void func(void). | ||||
---|---|---|---|---|
| ||||
Posted in reply to ciechowoj | 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 Re: C's void func() vs. void func(void). | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | 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 Re: C's void func() vs. void func(void). | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | 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 Re: C's void func() vs. void func(void). | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | 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 Re: C's void func() vs. void func(void). | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | 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.
|
Copyright © 1999-2021 by the D Language Foundation