Descriptions of two syntaxes for calling functions by using pointers (32109)



The information in this article applies to:

  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 2.0
  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET (2002)
  • Microsoft Visual C++ .NET (2003)
  • Microsoft Visual C++ 2005 Express Edition

This article was previously published under Q32109
Note Microsoft Visual C++ .NET 2002 and Microsoft Visual C++ .NET 2003 support both the managed code model that is provided by the Microsoft .NET Framework and the unmanaged native Microsoft Windows code model. The information in this article applies only to unmanaged Visual C++ code. Microsoft Visual C++ 2005 supports both the managed code model that is provided by the Microsoft .NET Framework and the unmanaged native Microsoft Windows code model.

SUMMARY

The source code below contains what appears to be an improper use of a pointer to a function. However, the code is correct. There are two ways to call a function when using a pointer to a function:
(*pointer_to_function)();
				
pointer_to_function();
				
The behavior exhibited in the sample code is expected. The ANSI Standard (Document Number X3J11/88-002, January 11, 1988) allows a function to be called through a pointer with the following syntax
(*pointer_to_function)();
				
in addition to the following nontraditional syntax:
pointer_to_function();
				
The text below is quoted from page 41 of the "Rationale for Draft Proposed American National Standard for Information Systems Programming Language C" (sec. 3.3.2.2, "Function calls"):

The latter construct, not sanctioned in the Base Document, appears in some present versions of C, is unambiguous, invalidates no old code, and can be an important shorthand.

MORE INFORMATION

The sample code below demonstrates this method.

Sample code

/*
 * Compile options needed: none
 */ 

#include <stdio.h>

void main(void)
{
   void ftn(void);
   void (*ptr_to_ftn)(void);

   ptr_to_ftn = ftn;   // The pointer is correctly assigned
                       // the address of 'ftn()'

   printf("\nCalling the function\n\n");

   ptr_to_ftn();     // This is not traditional syntax for
                       // a call through a function pointer

   printf("back to main\n");
}

void ftn(void)
{
   printf("in the function\n\n");
}
				

Modification Type:MinorLast Reviewed:4/24/2006
Keywords:kbinfo kbLangC KB32109 kbAudDeveloper