C ++的非C语言的外部“ C”功能

Ref*_*ion 5 c++ linkage extern-c

众所周知,extern "C"对C ++函数的声明使它的名称具有C链接,从而使C代码可以链接。

我的问题是-是否可以使C ++函数名称链接到其他编程语言,例如extern "Lisp"or extern "FORTRAN"

如果没有,为什么?构成"C"限制的背后的内部结构是什么?

有哪些选择?

Dav*_*nan 4

C++ 标准 7.5.2 dcl.link 规定:

\n\n
\n

C++ 和非 C++ 代码片段之间的链接可以使用链接规范来实现:

\n\n
linkage-specification:\n    extern string-literal { declaration-seqopt}\n    extern string-literal declaration\n
Run Code Online (Sandbox Code Playgroud)\n\n

字符串文字表示所需的语言链接。此国际标准指定了字符串文字“C”和“C++”的语义。有条件地支持使用除“C”或“C++”之外的字符串文字,并具有实现定义的语义。[ 注意:\n 因此,具有实现未知的字符串文字的链接规范需要进行诊断。\xe2\x80\x94end note ] [\n 注意:建议从定义该语言的文档中获取字符串文字的拼写。例如,Ada(不是 ADA)和 Fortran 或 FORTRAN,具体取决于年份。\xe2\x80\x94结束注]

\n
\n\n

因此原则上,实现者可以选择支持除C和C++之外的其他链接规范。

\n\n

然而实际上,在所有现代平台上,C 连接是最低的共同点。作为一般规则,如今,除 C 之外的语言的二进制互操作都使用 C 链接。在广泛使用的现代平台上,除了 C 和 C++ 链接之外,您不会看到任何其他内容。

\n

  • 在 20 世纪 80 年代和 90 年代,从 Pascal 到 C/C++ 作为 Mac 主要开发语言的过渡期间,它在“经典”Mac OS 编译器上很常见。由于历史原因,Mac 工具箱和操作系统使用 Pascal 调用约定。 (3认同)
  • IBM zOS 编译器记录 extern“FORTRAN”、extern“COBOL”甚至 extern“PLI” (2认同)