命名空间嵌套函数的最佳实践和语义以及extern"C"的使用

Has*_*yed 3 c++ portability abi

我正在创建一个带有C-ABI接口的C++库.

这就是GCC如何处理关于重整的外部"C"限定符:

namespace x {

    extern "C" int monkey(int x) {
        return 1;
    }

    int chimpanzee(int x) {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

相关nm产出:

00000000004005cd T _ZN1x10chimpanzeeEi
00000000004005bf T monkey
Run Code Online (Sandbox Code Playgroud)

问题: 我想在命名空间中保留C-ABI中涉及的函数,以便最大程度地重用.重要说明:编译库后,我将为链接器提供映射文件(GCC)或模块定义文件(MSVC).

  1. 是否存在输出标准行为 - 其他主要编译器(特定的MSVC)是否也会进行修正?
  2. 当他们涉及外部ABI时,他们在名称空间中放置函数是否存在任何陷阱或最佳实践?
  3. 这会在链接时间内干扰去除功能的C-ABI输出吗?

Ste*_*e M 5

你正在做的事情很好,并会给你你想要的效果.来自C++编程语言,第3版,第208页:"可以在命名空间中声明具有C链接的名称.命名空间将影响在C++程序中访问名称的方式,但不会影响链接器看到它的方式.printf()来自std一个典型的例子......即使被召唤std::printf(),它仍然是旧的C.printf()"