Hateful C Compiler Magic

chromatic on 2007-05-10T06:55:16

Suppose that I want to call a C function in a shared library. Suppose also that the only way I can call this function is through a function pointer.

That part I know how to do. That's solvable.

Now suppose that I want to call a varargs function, and the same caveats apply. I have to call this function through a function pointer.

How do I do it? Do I build my own va_list structure by hand? If so, how?


Code

lbr on 2007-05-10T07:53:48

It's actually pretty straightforward:

#include <stdio.h>
#include <stdarg.h>

void bar(int cnt, ...) {
    va_list ap;
    va_start(ap,cnt);
    while (cnt--) {
        int a = va_arg(ap, int);
        printf("%d ", a);
    }
    printf("\n");
}

int main() {
    void (*b)(int, ...);
    b = bar;
    b(2,1,2);
    b(3,1,2,3);
    return 0;
}

Or did I miss something?

Re:Code

chromatic on 2007-05-10T08:49:00

Or did I miss something?

Hmm, no. I missed b = bar; in my example, which leads me to wonder why there was no crash.

Thanks for the sanity check! Now I need to figure out how to add varargs support to NCI.