www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - C's void func() vs. void func(void).

reply ciechowoj <keepitsimplesirius gmail.com> writes:
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.
Jul 29 2016
parent reply Mike Parker <aldacron gmail.com> writes:
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();
Jul 29 2016
next sibling parent reply Mike Parker <aldacron gmail.com> writes:
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.
Jul 29 2016
parent ciechowoj <keepitsimplesirius gmail.com> writes:
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.
Jul 29 2016
prev sibling parent reply ag0aep6g <anonymous example.com> writes:
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?
Jul 29 2016
parent Mike Parker <aldacron gmail.com> writes:
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.
Jul 29 2016