c - Is this the correct way to use va_arg with pointer to function? -


in function this:

typedef double(*dfun)(double);  void tab(double x, int n, ...) {     va_list args;      va_start(args, n);      printf("%5.2lf  \t", x);      (int i=0; i<n; i++)     {         dfun tmp = va_arg(args, dfun);          printf("  %5.2lf  \t", tmp(x));     }      va_end(args); } 

is wrong if pull arguments this:

    double(*tmp)(double) = va_arg(args, double(*)(double)); 

i came upon this article suggest different approach if doesn't work:

q: can't va_arg pull in argument of type pointer-to-function.

a: try using typedef function pointer type. type-rewriting games va_arg macro typically plays stymied overly-complicated types such pointer-to-function.

in case works in both versions (gcc 5.2.1), that's why wondering 1 approach better other? there potential error when don't typedef pointer function first?

using pointer without typedef can indeed cause problems in cases.

standard explains type used in va_arg must written in way, adding suffix * create pointer type:

7.16.1.1 va_arg macro

  1. the parameter type shall type name specified such type of pointer object has specified type can obtained postfixing * type.

therefore have compatible code, when using function pointers, should use typedef, because * cannot added function pointer type suffix create pointer type, because syntax isn't valid:

(double)(*)(double) => (double)(*)(double)*

but can added typedef:

dfun => dfun*


Comments

Popular posts from this blog

wireshark - USB mapping with python -

c++ - nodejs socket.io closes connection before upgrading to websocket -

Deploying Qt Application on Android is really slow? -