【问题标题】:C++'s extern-"C" functionality to languages other than CC++ extern-"C" 功能到 C 以外的语言
【发布时间】:2014-02-24 09:49:18
【问题描述】:

众所周知,将extern "C" 声明为C++ 函数会使其名称具有C 链接,从而使C 代码能够链接。

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

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

有什么选择?

【问题讨论】:

  • 不,因为几乎所有其他内容都与 C 及其调用约定兼容。
  • 还有外部帕斯卡...
  • "C" 是C++ 标准要求的唯一这样的链接,但编译器可以免费提供更多;这就是为什么它是一个字符串常量。 extern "FORTRAN" 对于同时具有 C++ 和 FORTRAN 前端的编译器非常有意义。如果仅仅是因为 Lisp 环境往往是它自己的整体,我不会期望看到 extern "Lisp"。
  • 语言链接(extern "C++"、extern "C"、extern "FORTRAN")与调用约定(stdcall、fastcall 等)不同,后者被标记为重复.

标签: c++ linkage extern-c


【解决方案1】:

C++ 标准 7.5.2 dcl.link 说:

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

linkage-specification:
    extern string-literal { declaration-seqopt}
    extern string-literal declaration

字符串文字表示所需的语言链接。这 国际标准指定字符串文字的语义 “C”和“C++”。使用“C”或“C++”以外的字符串文字是 有条件地支持,具有实现定义的语义。 [ 笔记: 因此,带有字符串文字的链接规范是 未知的实现需要诊断。 ——尾注] [ 注意:建议 string-literal 的拼写为 取自定义该语言的文档。例如,艾达(不是 ADA)和 Fortran 或 FORTRAN,具体取决于年份。 ——尾注]

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

然而,实际上,在所有现代平台上,C 链接是最小的公分母。作为一般规则,如今,C 以外的语言的二进制互操作使用 C 链接。在广泛使用的现代平台上,除了 C 和 C++ 链接之外,您不会看到任何其他东西。

【讨论】:

  • extern "Pascal" 存在(尽管它是一个非标准扩展) - 它用于区分 C 和 Pascal 之间的不同参数传递约定。
  • @PaulR 它已经很久没有使用了(我认为我的编译器都不支持它),而且我从来没有使用过。而且我做了很多 C/Pascal 互操作。现在所有的 Pascal 编译器都可以做到 cdeclstdcall
  • 它曾经在 1980 年代和 1990 年代的“经典”Mac OS 编译器上很常见,当时是从 Pascal 过渡到 C/C++ 作为 Mac 的主要开发语言。由于历史原因,Mac 工具箱和操作系统使用 Pascal 调用约定。
  • 嗯,对我来说似乎只是昨天...... ;-)
  • IBM zOS 编译器文档 extern "FORTRAN"、extern "COBOL",甚至是 extern "PLI"
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2014-03-20
  • 2011-03-28
  • 1970-01-01
  • 2013-07-14
  • 2019-12-22
相关资源
最近更新 更多