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

ID: Q49064


The information in this article applies to:
  • Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, 6.0ax
  • Microsoft C/C++ for MS-DOS
  • Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5
  • Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 5.0, 6.0


SYMPTOMS

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 "/W3" 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 "/W4" 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 "/W4" option is used:
C4220: varargs matches remaining parameters


RESOLUTION

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.).



MORE INFORMATION

The following program will generate a warning when compiled with the warning level set as specified by the "compile options needed" 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 <stdio.h>

  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("format string goes here", other_args);
  }
 

Additional query words:

Keywords : kbcode kbLangC kbVC100 kbVC150 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Version : MS-DOS:; WINDOWS:1.0,1.5; winnt:1.0,2.0,2.1,4.0,5.0,6.0
Platform : MS-DOS WINDOWS winnt
Issue type : kbinfo


Last Reviewed: July 15, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.