Hello, Some days ago, I did a conversion from a C header to Pascal, and I noticed that H2Pas tool could implement a little bit improvement for Variadic[1] (or varargs) functions conversion.
Consider the following C function with `varargs`: int function foo(int bar, ...) {}; I can call this function in two ways: 1. foo("Bar"); 2. foo("Bar", "some", "separed", "arguments", "without", "squared", "braces"). Usually, H2Pas convert it overloaded: function foo(bar: cint): cint; cdecl ... function foo(bar: cint; args: array of const): cint; cdecl ... And it doesn't work when a code needs to work both in FPC and Delphi. For Delphi compiler, to compile the converted header, you needs to specify the overload directive: function foo(bar: cint): cint; cdecl; overload ... function foo(bar: cint; args: array of const): cint; cdecl; overload ... But, even specifying the overload, the converted function doesn't works in Delphi. But someone can say: why Delphi, Mr? No special reason, currently I just write code that needs to compile both in FPC and Delphi. OK, but, how to declare a variadic function in FPC/Delphi? It is very easy: function foo(bar: cint): cint; verargs; cdecl; ... Let's go to read its documentation: This modifier can only be used together with the cdecl modifier, for > external C procedures. It indicates that the procedure accepts a variable > number of arguments after the last declared variable. These arguments are > passed on without any type checking. It is equivalent to using the array of > const construction for cdecl procedures, without having to declare the > array of const. The square brackets around the variable arguments do not > need to be used when this form of declaration is used. [2] Great! So, using the varargs directive, I can declare and use my function more C-like. =) We already use something like this in WriteLn/ReadLn, eg: WriteLn('some', 'separed', 'arguments', 'without', 'squared', 'braces'). So, after this little explanation, what do you think about add a new param in H2Pas tool? Something like: -V Declare C variadic functions with varargs directive. Thank you! [1] https://en.wikipedia.org/wiki/Variadic_function [2] http://www.freepascal.org/docs-html/ref/refsu83.html -- Silvio Clécio
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal