title: Including C++ header file with namespace in C source file causes compilation error
body: <p>I'm not an expert C++ programmer, and i have been recently doing a trick thing in C++ which is causing me the below issue.</p>
  
  <p>Objective of my task: Specific non system thread (cooperative threading actually) safe module is duplicated to create a system thread safe version to support different needs in the system. But instead of creating sys_XXX functions to keep the compatibility, we have decided to create a namespace to protect the system thread version in a C++ header file. I can actually include this in the CPP file and work happily but i just realised my funcInit call is not called before it reaches the CPP file control. Unfortunately this init for the cooperative threading version is in a C file. Now i need to init my system thread safe version from the same place, but im have been blocked by the compilation error which are hard to solve from my knowledge.</p>
  
  <p>Compilation Error log:-</p>
  
  <pre><code>In file included from sysinit.c:87:
  sys_unicode.h:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'SystemThreadUtils' &lt;== corresponds to line [namespace SystemThreadUtils {]
  sysinit.c:88:
  sysinit.c:512: error: expected identifier or '(' before string constant &lt;== corresponds to line [extern "C" bool SystemThreadUtils::funcInit(void);]
  sysinit.c:513: error: expected identifier or '(' before string constant &lt;== corresponds to line [extern "C" bool SystemThreadUtils::funcTerm(void);]
  sysinit.c: In function 'SysInit':
  sysinit.c:817: error: 'SystemThreadUtils' undeclared (first use in this function) &lt;= corresponds to line [SystemThreadUtils::funcInit();]
  sysinit.c:817: error: (Each undeclared identifier is reported only once
  sysinit.c:817: error: for each function it appears in.)
  sysinit.c:817: error: expected ')' before ':' token
  sysinit.c: In function 'SysTerm':
  sysinit.c:2737: error: expected expression before ':' token &lt;== corresponds to line [SystemThreadUtils::funcTerm();]
  sysinit.c:2737: warning: label 'SystemThreadUtils' defined but not used
  </code></pre>
  
  <p>Source and header snippets FYI :-</p>
  
  <p>C header file (unicode.h):</p>
  
  <pre><code>// all functions called from the C source file
  funcInit();
  funcA();
  funcB();
  funcTerm();
  </code></pre>
  
  <p>C header file (unicode.c):</p>
  
  <pre><code>// all functions called from the C source file
  funcInit() {
  }
  funcA() {
  }
  funcB() {
  }
  funcTerm() {
  }
  </code></pre>
  
  <p>C++ header file (sys_unicode.h):</p>
  
  <pre><code>#include "unicode.h"
  namespace SystemThreadUtils {
  
      // below functions called from the C source file
      extern "C" funcInit();
      extern "C" funcTerm();
  
      // below functions called from the CPP source file
      funcA();
      funcB();
  }
  </code></pre>
  
  <p>C++ source definition (sys_unicode.cpp):</p>
  
  <pre><code>#include "sys_unicode.h"
  
  namespace SystemThreadUtils {
  
      // below functions are called from C source
      funcInit() {
      }
      funcTerm() {
      }
  
      // below methods are called from CPP source
      funcA() {
      }
      funcB() {
      }
  }
  </code></pre>
  
  <p>CPP source # 1 (utils.cpp):</p>
  
  <pre><code>#include "sys_unicode.h"
  
  using namespace SystemThreadUtils;
  
  utils::utils_init()
  {
     funcA();
     funcB();
  }
  </code></pre>
  
  <p>C source #2 (sysinit.c):</p>
  
  <pre><code>#include "sys_unicode.h"
  
  extern "C" bool SystemThreadUtils::funcInit(void);
  extern "C" bool SystemThreadUtils::funcTerm(void);
  
  SysInit ()
  {
     funcInit(); // non system thread safe version
     SystemThreadUtils::funcInit();  // system thread safe version
  }
  SysTerm ()
  {
     funcTerm(); // non system thread safe version
     SystemThreadUtils::funcTerm();  // system thread safe version
  }
  </code></pre>