Microsoft KB Archive/140357

= BUG: No Warning Using Extern "C" in a Namespace =

Article ID: 140357

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * 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
 * Microsoft Visual C++ .NET 2002 Standard Edition
 * Microsoft Visual C++ .NET 2003 Standard Edition

-



This article was previously published under Q140357



SYMPTOMS
Unexpected behavior can occur when you use extern "C" in a namespace.



CAUSE
Among other things, extern "C" directs the compiler not to decorate the names of symbols. But a symbol name is not recognized as part of a namespace outside of a translation unit unless the namespace name is part of the decorated name for the symbol.

The compiler should generate a warning when using extern "C" in a namespace, but it does not.



RESOLUTION
Don't use extern "C" linkage in a namespace. If you have to use extern "C" linkage, use it outside of a namespace.



STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.



MORE INFORMATION
The following sample programs (Test1.cpp and Test2.cpp) demonstrate two cases of this.

Sample Code to Reproduce Problem
/test1.cpp /* Compile options needed: -W4 namespace A{  extern "C" void printf(int); }

void main{ A::printf(1); // actually resolves to CRT printf // which causes an access violation } //end of test1.cpp

//test2.cpp

/* Compile options needed: -W4


 * 1) include 

namespace A{  extern "C" void  function(void){cout <<"namespace A" <<endl;};

}

namespace B{  extern "C" void function(void){cout <<"namespace B" <<endl;};

}

void main{ A::function; B::function;

} // end of test2.cpp The compiler names both the functions as just "_function" resulting in the following link errors:

error LNK2005: _function already defined in test2.obj.

LNK1169: one or more multiply defined symbols found.

-or-

LNK1179 : invalid or corrupt file: duplicate comdat "_function"

Additional query words: 10.00 10.10 LNK2005 LNK1169

Keywords: kbbug kbcompiler kbcpponly kbprogramming KB140357

-

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

© Microsoft Corporation. All rights reserved.