Microsoft KB Archive/49064

= INFO: Declaring a Pointer to a Function: C4071, C4001, or C4220 =

Article ID: 49064

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++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q49064





SUMMARY
In Microsoft C, the old method of declaring a pointer to a function,   type (*ptr); ptr = function; causes the following compiler warnings when compiling with the &quot;/W3&quot; option in C versions 6.0, 6.0a, and 6.0ax:

C4071: 'ptr' : no function prototype given

Microsoft C/C++ version 7.0 generates the following warning when the &quot;/W4&quot; option is used:

C4001: nonstandard extension [...] was used

Visual C++, 16- and 32-bit editions, versions 1.0 and above generate the following warning when the &quot;/W4&quot; option is used:

C4220: varargs matches remaining parameters



MORE INFORMATION
Use one of the following methods to avoid the warning message:   Prototype the function with a complete argument list and then specify actual parameters when declaring the pointer, as follows:      type function(parameter_list); type (*ptr)(parameter_list); ptr = function; Note: The parameter list must be exactly the same parameter list with which the function was declared.  Adjust the warning level (i.e., /W1, /W2, etc.).

The following program will generate a warning when compiled with the warning level set as specified by the &quot;compile options needed&quot; comment. To eliminate the warning use the prototype which is shown in the comment.

Sample Code
/* Compile options needed: /W3 - Microsoft C version 6.xx                            /W4 - Microsoft C/C++ version 7.0, Visual C++, all versions */

#include 

void main (void) {    /* Declare 'fun_ptr' as a pointer to a function  */ /* Use the following line to correct the warning */ /* int (*fun_ptr)(const char *, ... ); */ int (*fun_ptr); int other_args;

/* Assign pointer to the specific function, 'printf' */ fun_ptr = printf; <= error C2440: '=' : cannot convert from 'int (__cdecl *)(const char *,...)' to 'int (__cdecl *)(void) When using VC++ 6.0. Workaround still works.

/* Standard usage in calling environment */ fun_ptr(&quot;format string goes here&quot;, other_args); }

Keywords: kbinfo kblangc kbcode KB49064

-

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

© Microsoft Corporation. All rights reserved.