Microsoft KB Archive/49064

From BetaArchive Wiki
Knowledge Base


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 "/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

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 "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);
  }

                

Keywords: kbinfo kblangc kbcode KB49064