C 和 C++ 中类型的互操作性

Posted

技术标签:

【中文标题】C 和 C++ 中类型的互操作性【英文标题】:Interoperability of types in C and C++ 【发布时间】:2014-01-29 03:51:55 【问题描述】:

一个非常简单的问题:是否可以保证 C int 与 C++ int 在同一系统上相同?

不用说,这当然是一个纯粹的理论问题。

C 和 C++ 标准使用相同的语言来定义基本类型。但是,尽管 Fortran 2003 清楚地表明了这一点

use ISO_C_BINDING
integer(kind=c_int) :: i

声明了一个整数类型,它与“伴侣 C 处理器”上的 int 类型兼容,我在 C++ 标准中找不到任何这样的断言。 Fortran 提供比 C++ 更强大的 C 互操作性保证,这似乎很奇怪!

我能找到的最接近的是第 7.5 节 [dcl.link],C++11 标准的第 3 段,其中指出

每个实现都应提供与用 C 编程语言编写的函数的链接

但是这个小句子(对我来说)似乎不足以保证基本类型的兼容性。

我忽略了 C++ 标准中是否有其他语言可以保证这一点,或者它是否显然被视为理所当然以至于没有人费心明确地说明它?

编辑:cmets 中的 David Schwartz 指出,当我说“相同的系统”时,我说得不准确。我的意思是同一个“平台”,即硬件、操作系统、系统库等。当然,这确实是一个 ABI 问题。在引用的段落中,C++ 标准似乎想要表明您可以使用 extern "C" 调用 C 函数,但我不确定它是否提供了足够的其他保证?

【问题讨论】:

我会将在同一系统上扩展到在同一系统上使用相同的编译器和编译器设置。否则答案肯定是否定的(你可以在 64 位系统上用 32 位 int 编译 i386 二进制文件) “同一个系统”是什么意思?一样的硬件?相同的操作系统?相同的编译器套件?相同的系统库? 也许是 3.9.1p3 The signed and unsigned integer types shall satisfy the constraints given in the C standard, section 5.2.4.2.1. ? @JesseGood 那句话没有出现在我的 C++11 草案中(n3337)——我想我需要找到一个更新的。我认为这似乎涵盖了它 - 但留下了浮点类型的问题,bool/_Bool 和标准布局结构...... @JesseGood: 5.2.4.2.1 的措辞是“在幅度上应等于或更大”的最小范围... C++ 编译器可以满足使用比特定 C 编译器(具有特定命令行参数等)更宽或更窄的 int 的要求。 【参考方案1】:

没有。

在 x64 amd 兼容的 cpu 上广泛使用的兼容编译器默认将 long 视为 32 位,将其他视为 64 位。因此,即使是同一系统上的两个 C++ 编译器也不会出现这种情况,更不用说 C++ 和 C 编译器了。

在一个编译器中,这取决于编译器供应商是否兼容。他们通常(总是)是。 “一个编译器”在这里有点用词不当:从某种意义上说,C 和 C++ 编译器是不同的编译器,即使在同一个供应商的同一个二进制文件中也是如此。

【讨论】:

答案是正确的。 C 和 C++ 标准使用类似的语言,并且显然不保证任何整数都是任何特定大小。出于类似的原因,我也不相信 Fortran 编译器能够兑现其承诺。

以上是关于C 和 C++ 中类型的互操作性的主要内容,如果未能解决你的问题,请参考以下文章

关于通过 ref、空指针和 IntPtr 传递结构的互操作问题

数据结构(09)_字符串类的实现

如何在 C# 和 C++ 之间进行互操作

[转]Go与C语言的互操作

VS2010之C++

映射平台特定的互操作类型