【发布时间】: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的要求。
标签: c++ c language-lawyer language-interoperability