C++ 对 C 以外的语言的 extern-“C”功能

问题描述 投票:0回答:2

众所周知,将

extern "C"
声明给 C++ 函数会使其名称具有 C 链接,从而使 C 代码能够链接。

我的问题是 - 是否有其他编程语言可以使 C++ 函数名称具有链接,例如

extern "Lisp"
extern "FORTRAN"

如果没有,为什么?

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

有哪些替代方案?

c++ linkage extern-c
2个回答
4
投票

C++ 标准 7.5.2 dcl.link 说:

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

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

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

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

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


0
投票

大多数当代 C++ 编译器不支持 ISO C++ 标准要求的

extern "C"
extern "C++"
以外的任何内容。与其他语言的集成最常使用 C 调用约定和
extern "C"

即使支持非 C 调用约定,它们通常也不会被

extern
字符串文字选择,它们仍然使用
extern "C"
但与一些非标准调用约定声明结合使用:例如,Microsoft C++ for 16 位平台(DOS、Windows 3.x、OS/2 1.x)使用
__pascal
用于 Pascal 调用约定,使用
__fortran
用于 Fortran,而不是像
extern "Pascal"
extern "Fortran"
之类的东西。

也就是说,IBM 的 z/OS 当代 C++ 编译器支持

extern "FORTRAN"
用于调用 Fortran,
extern "COBOL"
用于调用 COBOL,以及
extern "PLI"
用于调用 PL/I。

类似地,IBM i 上的 IBM ILE C++ 编译器支持不同

extern
字符串文字的完整列表,请参阅 IBM i:ILE C/C++ 程序员指南 的 PDF 第 338 页,如
extern "RPG"
extern "C nowiden"
(即类似于
extern "C"
,但关闭整数提升,因此
short
实际上将作为 2 个字节而不是 4 个字节传递),
extern "OS"
(这启用了 IBM 的旧版 pre-ILE 调用约定)。

看来,如今 IBM 是唯一支持非

"C"
/
"C++"
extern
的主要 C++ 供应商,甚至只在大型机和中型平台上支持它们;但是,从历史上看,可能还有其他人。

© www.soinside.com 2019 - 2024. All rights reserved.