On Thu, 19 Jul 2012 08:33:12 +0100, Paulo Pinto <pj...@progtools.org> wrote:

On Wednesday, 18 July 2012 at 20:13:10 UTC, Walter Bright wrote:
On 7/18/2012 11:47 AM, Jacob Carlborg wrote:
On 2012-07-18 20:43, Walter Bright wrote:
On 7/18/2012 4:59 AM, Jacob Carlborg wrote:
Does that mean that this C++ declaration:

void foo (...);

Not allowed in C or C++.

When compiling in C++ mode, both Clang and GCC accepts this.

How would you get the arguments inside foo?

As described here,

http://pubs.opengroup.org/onlinepubs/7908799/xsh/varargs.h.html

That /requires/ an argument in the definition (AFAIKS), e.g.

        execl(va_alist)  <- va_alist is the argument name
        va_dcl <- this is #define va_dcl va_list va_alist;
        {
        }

so, it's no different to any other old-style function, e.g.

        foo(a)
        int a;
        {
        }

Now.. the declaration may be a different story. These would be valid declarations for the above:

        void execl();  <- no parameters necessary in a declaration
        void foo();    <- no parameters necessary in a declaration

It may be that GCC allows a declaration of:

        void execl(...);

But I wasn't ware that was valid ANSI C, perhaps it's a GCC/clang feature? Can anyone find docs on it?

If we /assume/ the above declaration always refers to a function with a definition of:

        execl(va_alist)
        va_dcl
        {
        }

Then we assume the first argument is /always/ going to be a 32 bit value (int, or 32 bit pointer) then we could speculatively convert to this D

extern (C) void execl(int first, ...);

But, if either assumption is false this would probably crash when used.

R

--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to