[CSS入门到进阶] 外国前端开发者说的 Intrinsic Ratios in css 是什么意思?

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。

解释 Intrinsic Ratios in css

自从互联网Web诞生以来,外国开发者就开始了对 Intrinsic Ratios (aka Aspect Ratios) 的讨论。

  • Intrinsic Ratios 直译:固有的比例。
  • aka:你见过rapper说话吗?这个aka就是他们常说的『 Hey man, 我是 AA aka ZZ 』中的aka,是also known as的缩写。
  • Aspect Ratios 直译:纵横比。

用中国前端开发者的话说,就是在未知宽高的情况下,使一个元素保持固定的长宽比

(备注:该问题要求未知宽高是因为,如果已知元素宽度,而固定的长宽比也是知道的,那么高度是可以直接算出来的,可以在css写死width和height,这种问题没挑战性。所以要求未知宽高)

Intrinsic Ratios 案例

比如做一个固定比例的视频播放器,不管你上传的视频是什么分辨率,你总让它保持16:9的比例。此外网页需要是响应式的,视频宽度是100%,即视频宽度随着浏览器宽度变化而变化,也就是说:该元素的具体宽度、高度是未知的。那么这就是一种 Intrinsic Ratios 问题。

举个例子

举个例子,这里有个div:

<html>
<body>
  <div class="main">
  </div>
</body>
</html>

如果实现这个div的宽:高=2:1,你会怎么做?

我看看有多少人认为是这样子实现的:

.main {
  width: 100%;
  height: 50%;
}

这样子不可以。为什么?

css中height属性,如果设置为百分比,会用它的父元素的 高度 乘以height百分比。

但是这个案例中,div的父元素body没有设置高度,也就是说body的真实高度是靠它的子元素来确定的,它的孩子有多高,它就有多高。

好家伙,死锁了。

所以这种情况下,如果父元素高度不确定,那么height百分比就无效了!以防死锁。

传统解决方案

通常,我们这么实现:

.main {
  width: 100%;
  height: 0;
  padding-bottom: 50%;
}

代码片段

设置height为0,再设置padding-bottom为50%。为什么这样就可以了呢?

css中padding-toppadding-bottom属性,如果设置为百分比,会用它的父元素的 宽度 乘以百分比。

看到差别了吗?虽然padding-bottomheight同样是表征y轴的样式,但是作为百分比时,他们却要乘以不同的底数。估计很多初学者都被搞晕了吧。

现代解决方案

上面是传统的解决方案,如果要实现16:9的比例,其实对开发者不太友好,你能要设padding-bottom为16/9=56.25%才可以,但是可读性很差。

在2021年1月,Chrome 88 版本发布,支持了新特性:CSS aspect-ratio,可以直接用来解决 Intrinsic Ratios 问题。

现在你可以直接这么写:

.main {
  width: 100%;
  aspect-ratio: 16/9;
}

代码片段

但是它确实是比较新的特性:

  • 如果是toC或者toB的项目,建议使用传统解决方案。
  • 如果是内部的工具或平台,可以大胆的使用新版特性。

具体兼容性如下:

1.png

写在最后

我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。

<think>根据用户的问题,他询问的是Fortran中“USE, INTRINSIC :: ISO_C_Binding”语句的含义。我们注意到用户之前提供的引用内容似乎与当前问题无关,因此我们将忽略这些引用,专注于问题本身。 首先,我们需要明确这个语句的组成部分: - `USE`:Fortran中的模块引用关键字 - `INTRINSIC`:指定引用的模块是Fortran语言固有的(内建)模块 - `ISO_C_Binding`:特定的模块名称,用于Fortran与C语言的互操作性 接下来,我们将详细解释这个语句的作用和意义: 1. **核心功能**:`ISO_C_Binding`模块定义了Fortran与C语言之间进行互操作(interoperability)所需的数据类型、函数和子程序。它允许Fortran程序调用C函数,反之亦然。 2. **关键组件**: - **数据类型映射**:提供与C语言兼容的数据类型,例如: - `C_INT` 对应C的`int` - `C_FLOAT` 对应C的`float` - `C_CHAR` 对应C的`char` - **过程接口**:定义`C_FUNPTR`(函数指针)和`C_F_PROCPOINTER`(过程指针)等 - **常量与函数**:包含`C_NULL_PTR`(空指针)、`C_ASSOCIATED`(指针关联检查)等 3. **使用场景**: - 当Fortran需要调用C语言编写的库时 - 将Fortran子程序暴露给C代码调用 - 处理跨语言的内存管理和指针操作 4. **语法结构详解**: ```fortran USE, INTRINSIC :: ISO_C_Binding ``` - `INTRINSIC`关键字强调这是语言标准内置模块,非用户自定义 - 可选的`ONLY`子句可限制导入内容,如: ```fortran USE, INTRINSIC :: ISO_C_Binding, ONLY: C_INT, C_DOUBLE ``` 5. **实际应用示例**: Fortran调用C函数的典型流程: ```fortran ! Fortran主程序 PROGRAM Call_C USE, INTRINSIC :: ISO_C_Binding INTERFACE ! 声明C函数原型 SUBROUTINE c_function(arg) BIND(C, NAME="c_function") USE ISO_C_Binding INTEGER(C_INT), VALUE :: arg END SUBROUTINE END INTERFACE INTEGER(C_INT) :: val = 42 CALL c_function(val) END PROGRAM ``` 6. **技术必要性**: - 解决数据类型对齐问题(如`C_PTR`类型) - 确保跨语言调用时参数传递的二进制兼容性 - 避免因编译器实现差异导致的错误 最后,我们生成相关问题: </think> ### Fortran中`USE, INTRINSIC :: ISO_C_Binding`语句详解 #### 1. **核心作用:实现Fortran与C语言的互操作性** 该语句启用Fortran的**C语言互操作特性**(C interoperability),允许: - **双向调用**:Fortran调用C函数 / C调用Fortran子程序 - **数据兼容**:确保两种语言间的数据类型、内存布局一致 - **符号兼容**:解决函数命名和链接问题 #### 2. **关键组件解析** ```fortran USE, INTRINSIC :: ISO_C_Binding ``` - **`INTRINSIC`**:声明使用**Fortran标准内置模块**(非用户自定义) - **`ISO_C_Binding`**:国际标准ISO/IEC 1539-1:2018定义的互操作模块[^1] #### 3. **核心功能实现** **(1) 数据类型映射** 提供与C语言对应的数据类型: | Fortran类型 | C类型 | 明 | |--------------------|---------------|--------------------------| | `C_INT` | `int` | 整数类型 | | `C_FLOAT` | `float` | 单精度浮点 | | `C_DOUBLE` | `double` | 双精度浮点 | | `C_CHAR` | `char` | 字符类型 | | `C_PTR` | `void*` | 通用指针 | **(2) 函数绑定机制** 通过`BIND(C)`属性声明跨语言接口: ```fortran ! Fortran调用C函数示例 FUNCTION c_sqrt(x) BIND(C, NAME="sqrt") RESULT(res) USE, INTRINSIC :: ISO_C_Binding REAL(C_DOUBLE), VALUE :: x ! VALUE表示按值传递 REAL(C_DOUBLE) :: res END FUNCTION ``` **(3) 特殊常量支持** 定义跨语言空指针和逻辑值: - `C_NULL_PTR`:对应C的`NULL` - `C_NULL_FUNPTR`:函数空指针 - `C_TRUE`/`C_FALSE`:与C兼容的逻辑值 #### 4. **典型应用场景** **(1) 调用C标准库函数** ```fortran PROGRAM Call_CTime USE, INTRINSIC :: ISO_C_Binding IMPLICIT NONE INTERFACE FUNCTION c_time() BIND(C, NAME="time") RESULT(t) IMPORT :: C_PTR ! 显式导入C_PTR类型 TYPE(C_PTR) :: t END FUNCTION END INTERFACE TYPE(C_PTR) :: time_ptr time_ptr = c_time() ! 调用C的time() END PROGRAM ``` **(2) 暴露Fortran子程序给C** ```fortran ! Fortran侧 SUBROUTINE fortran_sub(a, b) BIND(C, NAME="c_compatible_sub") USE ISO_C_Binding INTEGER(C_INT), INTENT(INOUT) :: a, b b = a * 2 END SUBROUTINE ``` ```c /* C侧调用 */ extern void c_compatible_sub(int* a, int* b); // 函数名与BIND(C)声明一致 ``` #### 5. **技术必要性** - **内存对齐保证**:`ISO_C_Binding`类型严格遵循C的内存对齐规则 - **符号修饰**:自动处理Fortran/C的函数名修饰差异(如Fortran默认小写+下划线) - **参数传递**:解决值传递(`VALUE`) vs 引用传递默认行为差异 - **编译器支持**:所有现代Fortran编译器均实现此标准(gfortran, ifort等) #### 6. **参数传递模式对比** | 属性 | 含义 | |-----------------|-------------------------------| | `VALUE` | 按值传递(C默认方式) | | 无属性 | 按引用传递(Fortran默认方式) | | `INTENT(IN)` | 输入参数(不可修改) | --- ### 相关问题 1. 如何在Fortran中正确处理C语言返回的字符串指针? 2. 使用`ISO_C_Binding`时有哪些常见的编译链接错误及解决方法? 3. Fortran如何通过`C_PTR`操作C语言动态分配的内存? 4. 混合编程中如何处理Fortran派生类型与C结构体的映射?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hull Qin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值