gpt4 book ai didi

c - C中的读写结构

转载 作者:太空狗 更新时间:2023-10-29 17:02:57 24 4
gpt4 key购买 nike

我知道 C 中的结构可能不会像在代码中那样布置内存。例如:

struct a {
short x;
int y;
};

假设 2 字节短整型和 4 字节整数,可能实际上在内存中占用 8 字节,因为编译器希望在 4 字节边界上对齐成员...所以 x 之间有 2 字节的松弛和你。

这使得读取和写入结构无法跨语言、编译器和硬件移植。读取和写入它们的唯一方法是逐个成员。是的,字节顺序在这里也是一个问题,交换必须在成员级别完成,但我们假设这不是问题。

Fortran 有一个用于派生类型(结构)的“序列”说明符,告诉编译器在给定成员时在内存中安排它们的布局。这允许对派生类型进行可移植的读写。

我的问题是:有没有办法以可移植(且可维护)的方式在 C 中做类似的事情?

最佳答案

是的,Fortran 2003 引入了 bind(C) 说明符,它告诉编译器执行与配套 C 编译器完全相同的操作

type, bind(C) :: a
components
end type

此外,iso_c_binding 模块(整个 Fortran 2003 C 互操作性的一个子部分)定义了可帮助您连接 C 和 Fortran 内部类型的常量:

use intrinsic :: iso_c_binding, only: c_short, c_int

type, bind(C) :: a
integer(c_short) :: x
integer(c_int) :: y
end type

据说这种类型可以与您的 C 结构互操作

编译器广泛支持 C 互操作性。很难找到不支持此功能但仍受其供应商支持的编译器。

混合使用 C 和 Fortran 时,请远离 sequence。根据标准,序列类型不能互操作。

关于c - C中的读写结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27211998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com