DOCUMENT:Q140357 07-FEB-2002 [visualc] TITLE :BUG: No Warning Using Extern "C" in a Namespace PRODUCT :Microsoft C Compiler PROD/VER::4.0,4.1,5.0,6.0 OPER/SYS: KEYWORDS:kbProgramming kbCompiler kbCPPonly kbVC kbVC400bug kbVC410bug kbVC500bug kbVC600bug ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - The C/C++ Compiler (CL.EXE), used with: - Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.1 - Microsoft Visual C++, 32-bit Enterprise Edition, versions 5.0, 6.0 - Microsoft Visual C++, 32-bit Professional Edition, versions 5.0, 6.0 - Microsoft Visual C++, 32-bit Learning Edition, version 6.0 - Microsoft Visual C++.NET (2002) ------------------------------------------------------------------------------- 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 */ #include namespace A{ extern "C" void function(void){cout <<"namespace A" <