C命名空间内的外部“C”链接?

新手上路,请多包涵
namespace someNameSpace {
    extern "C" void doSomething()
        {
             someOperations();
        }
}

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

someNameSpace 是否仍在封装 doSomething() 如果我将其暴露给 extern "C" 链接?

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

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

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

原文由 user3528438 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 416
1 个回答

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

见 7.5/6:

至多一个具有特定名称的函数可以具有 C 语言链接。出现在不同名称空间范围内的具有相同函数名称(忽略限定它的名称空间名称)的具有 C 语言链接的函数的两个声明指的是同一个函数。出现在不同名称空间范围内的具有相同名称(忽略限定它的名称空间名称)的具有 C 语言链接的变量的两个声明指的是同一个变量。具有 C 语言链接的实体不得与全局范围内的变量同名声明,除非两个声明都表示同一实体;如果声明出现在不同的翻译单元中,则不需要诊断。具有 C 语言链接的变量不得以与具有 C 语言链接的函数相同的名称声明(忽略限定各自名称的命名空间名称);如果声明出现在不同的翻译单元中,则不需要诊断。 [ _注意_:程序中只能出现一个具有给定名称的实体的定义和 C 语言链接(见 3.2);这意味着这样的实体不得在多个命名空间范围内定义。 —— 尾注]

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

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题