C ++命名空间内的extern“C”链接?

namespace someNameSpace { extern "C" void doSomething() { someOperations(); } } 

我想在C ++和C环境中运行doSomething()

如果我将它暴露给extern "C"链接, someNameSpace是否还在封装doSomething()

有没有一种很好的方法在C ++和C之间共享函数,同时避免在C ++端污染全局命名空间?

编辑 :因为此代码主要用于C ++模式,而C链接仅供测试使用,我想这是一种更好的方法。

 namespace someNameSpace { #ifdef COMPILE_FOR_C_LINKAGE extern "C" #else extern "C++" #endif { void doSomething() { someOperations(); } } } 

您的代码有效,但是您应该注意所有具有extern "C"链接的函数共享相同的名称空间,但是不要与“命名空间”的C ++概念混淆:您的函数实际上是someNameSpace::doSomething ,但是你不能在任何其他命名空间中使用非限定名称doSomething任何其他extern "C"函数。

见7.5 / 6:

最多一个具有特定名称的函数可以具有C语言链接。 具有相同函数名的C语言链接的函数的两个声明(忽略限定它的命名空间名称)出现在不同的命名空间范围内引用相同的函数。 具有相同名称的C语言链接的变量的两个声明(忽略限定它的命名空间名称)出现在不同的命名空间范围中引用相同的变量。 具有C语言链接的实体不得声明与全局范围内的变量同名,除非两个声明都表示同一实体; 如果声明出现在不同的翻译单元中,则无需诊断。 具有C语言链接的变量不应声明与具有C语言链接的函数同名(忽略限定相应名称的命名空间名称); 如果声明出现在不同的翻译单元中,则无需诊断。 [ 注意 :程序中只出现一个具有C语言链接名称的实体的定义(见3.2); 这意味着不能在多个命名空间范围内定义此类实体。 – 结束说明 ]

您公司或项目的全球风格仲裁者应该能够为您的代码库提供合适的命名政策建议。

只需一段代码来说明Kerrek SB答案中陈述的行为

 #include  namespace C{ void Hello(){ std::cout<<"Hello"< 

住在http://ideone.com/X26wfR