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

7
一个非常简单的问题:在同一系统上,C语言的int和C++语言的int是否是相同的东西?当然,这只是一个理论上的问题。
C语言和C++语言标准使用相同的语言来定义基本类型。但是,Fortran 2003明确表示:
use ISO_C_BINDING
integer(kind=c_int) :: i

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

最接近的是C ++ 11标准的第7.5节[dcl.link]第3段,它规定:

每个实现都应支持与用C编写的函数的链接

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

在C++标准中是否有我忽略的其他语言来保证这一点,还是显然被视为理所当然,没有人费心明确说明呢?

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


1
我会将“在同一系统上”扩展为“在具有相同编译器和编译器设置的同一系统上”。否则,答案肯定是否定的(您可以在64位系统上编译具有32位int的i386二进制文件)。 - Uli Köhler
2
也许在3.9.1p3版本中,“signed和unsigned整数类型应满足C标准第5.2.4.2.1节中给出的限制条件”。 - Jesse Good
@JesseGood 在我手头的C++11草案(n3337)中没有出现那句话--我想我需要找到更新的版本。 我想那应该可以概括,但仍然存在浮点类型、bool/_Bool和标准布局结构的问题... - Tristan Brindle
@TristanBrindle:那部分是由于缺陷报告483而添加的。你对其他基本类型是正确的。我认为C标准并没有对浮点类型做出任何要求。 - Jesse Good
2
@JesseGood:5.2.4.2.1是以“应等于或大于”每个最小范围的术语来表述的...一个C++编译器可以满足这些要求,使用比特定C编译器(具有特定命令行参数等)更宽或更窄的'int'。 - Tony Delroy
显示剩余2条评论
1个回答

5

不。

在x64 amd兼容cpu上,有广泛使用的符合编译器,它们默认将long视为32位,其他值视为64位。因此,即使是同一系统上的两个C++编译器也无法满足这种情况,更不用说C++和C编译器了。

在一个编译器内部,是否兼容取决于编译器供应商。他们通常(总是)是兼容的。“一个编译器”在这里有点误导性:C和C++编译器是不同的编译器,即使它们由同一供应商提供,并且在同一个二进制文件中。


答案是正确的。C和C++标准使用类似的语言,并明确表示不保证任何整数具有特定的大小。出于类似的原因,我不认为Fortran编译器能够兑现其承诺。 - david.pfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接