Microsoft KB Archive/107501

= You receive a C4226 or a C4236 error message when you compile code to contain the keyword in 32-bit Visual C++ =

Article ID: 107501

Article Last Modified on 4/28/2005

-

APPLIES TO


 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * 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 Q107501





SUMMARY
The __export keyword provided with the Visual C++ for Windows compiler is obsolete with the Microsoft Visual C++ 32-bit compiler. The equivalent functionality for WIN32 can be achieved by using the keyword __declspec with the dllexport attribute. With Visual C++ 32-bit Edition, version 4.0, compiling code containing the __export (or _export) keyword results in either of the following warnings:

C4236: nonstandard extension used : '__export' is an obsolete keyword, see documentation for __declspec(dllexport)

- or -

C4226: nonstandard extension used : '__export' is an obsolete keyword

Compiling code containing the __export (or _export) keyword with 32-bit Visual C++, versions 1.0 and 2.x, results in the C4226 warning.



MORE INFORMATION
The __declspec construct is not supported by the tools supplied with Microsoft Win32 Software Development Kit (SDK).

When porting DLL source code from Windows to Win32, replace each instance of __export with __declspec( dllexport ). The __declspec(dllexport) keyword can be used to export data, functions, classes, or class member functions. For example: /* exported function */ __declspec( dllexport ) void func;

/* exported data */ __declspec( dllexport ) int i;

// exported class class __declspec( dllexport ) DLLClass {     ...   };

class DLLClass {  public: // exported member function __declspec( dllexport ) void MemberFunction( void ); }; The sample code below demonstrates exporting classes and class member functions from a DLL using the __declspec( dllexport ) and __declspec( dllimport ) storage class attributes in the DLL and EXE, respectively.

Sample Code
/* DLL Sample: TESTDLL.CPP /* Compile options needed: /D"_X86" /MT TESTDLL.CPP /link /*                 /DLL /OUT:testdll.dll /implib:testdll.lib */

#include 

class DLLClass {      public: // exported member function __declspec( dllexport ) void functionA( void ) { printf("\nIn Function A of the exported function"); }      };

// exported class class __declspec( dllexport) ExportDLLClass {      public: void functionB(void) { printf("\nIn Function B of the exported class"); }      };

// exported instance of the DLLClass __declspec(dllexport) DLLClass test;

/* Source that calls the DLL Sample: CALLDLL.CPP /* Compile options needed: /D"_X86" /D"_CONSOLE" /ML CALLDLL.CPP /*                 TESTDLL.LIB */

#include 

class DLLClass {      public: // imported member function __declspec( dllimport ) void functionA( void ); };

class __declspec( dllimport) ExportDLLClass {      public: void functionB(void); };

__declspec( dllimport ) DLLClass test;

void main(void) {     ExportDLLClass TestClass;

test.functionA; TestClass.functionB; }

