Microsoft KB Archive/47961

= INFO: Extracting Function ptr from a Variable arg List Function =

Article ID: 47961

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft C Professional Development System 6.0a
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition

-



This article was previously published under Q47961





SUMMARY
In Microsoft C the va_arg macro may be used to remove an item from a variable argument list. When the element to be removed is complex, however, you may have to typedef the item type. This is necessary because the va_arg macro requires you to provide the type of the item to be removed from the list. For a pointer to a function, if you were to put the item type (the declaration of the function ptr) as follows: FuncPtr = va_arg (arg_list, (int(*)(void)) ); The compiler would yield the following error: C2059: Syntax Error : ')' You could try to get around this by grabbing the function pointer as a data pointer, and then typecasting it to a function pointer, as in the following line:  FuncPtr = (int (*)(void)) va_arg (arg_list, char *); This will work; however, you will get the following warning:

C4074: Non-standard extension used, cast of data pointer to function pointer

The best solution is to typedef the function pointer. With a typedef, you avoid both the error and the warning.



MORE INFORMATION
The following sample code passes a function pointer to a variable argument list function, changes that pointer, and returns it to the calling procedure. To implement this, however, you need to pass the function pointer by reference. For this reason, a pointer is typedef'd to a function pointer. Once in the variable argument list function, the pointer is dereferenced to the function pointer to get at the actual function pointer.

Sample Code

 * 1) include 
 * 2) include 

typedef void (*FuncPtr)(void); typedef FuncPtr *PFuncPtr;

void hello(void); void varfunc(int, ...);

FuncPtr func1, func2; int i;

void main(void) { func1 = hello; printf (&quot;Function pointer: func1 now points to Hello\n&quot;); printf (&quot;About to use func1 to make a call to Hello\n\n&quot;); func1; printf (&quot;Now lets pass these function pointers to our variable&quot;); printf (&quot; argument list\n&quot;); varfunc(2, &func1, &func2);  /* To alter ptr, pass by reference */ printf (&quot;\nAfter the call to the variable argument procedure,\n&quot;); printf (&quot;function pointer: func2 now points to Hello\n&quot;); printf (&quot;About to use func2 to make a call to Hello\n\n&quot;); func2; }

void hello(void) { printf (&quot;Hello, I'm in the procedure HELLO\n&quot;); }

void varfunc(int i, ...) { va_list arg_ptr; PFuncPtr tmpfptr;               /* Temporary ptr to function ptr

printf (&quot;\nIn function VARFUNC\n&quot;); va_start (arg_ptr, i); printf (&quot;%d arguments were passed\n&quot;, i); tmpfptr = va_arg (arg_ptr, PFuncPtr); /* Grab pointer to fnptr */ *tmpfptr = hello;                     /* Assign fnptr addr of fn    tmpfptr = va_arg (arg_ptr, PFuncPtr);  /* Grab pointer to fnptr */ *tmpfptr = hello;                     /* Assign fnptr addr of fn }

Keywords: kbinfo kblangc kbcode KB47961

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.