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

javascript - Laravel datatable invalid JSON response -

java - Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; -

sql server 2008 - My Sql Code Get An Error Of Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value '8:45 AM' to data type int -