C 编译器是否提供有确定长度的类型定义?

问题描述 投票:0回答:1

在C语言规范中,对内置类型的最小长度有限制,或者说编译器必须保证Char的长度必须至少为8bit,int 32bit,longlong 64bit等。 但是当我实现内核中与 arch 相关的部分时,我需要一些具有 8 位、16 位、32 位或 64 位确定长度的类型。使用这些类型,我可以读取表格或写入 8 位和 16 位 IO 端口或 32 位和 64 位寄存器。有没有现有的类型可以保证它的长度?

当我在 Linux 源代码中查找 u32 或 u64 等类型定义时,我发现它们是由内置类型定义的:

<uapi\asm-generic\int-ll64.h>
typedef __signed__ char __s8;
typedef unsigned char __u8;
typedef __signed__ short __s16;
typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;
typedef __signed__ long long __s64;
typedef unsigned long long __u64;

<linu\asm-generic\int-ll64.h>
typedef __s8  s8;
typedef __u8  u8;
typedef __s16 s16;
typedef __u16 u16;
typedef __s32 s32;
typedef __u32 u32;
typedef __s64 s64;
typedef __u64 u64;

然后内核使用这些类型来定义其他一些看起来有一定长度的类型:

#ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 phys_addr_t;
#else
typedef u32 phys_addr_t;
#endif

或者说在针对特定架构编译代码时,可以保证那些内置类型的长度?或者 Linux 的 makefile 使用一些标志和编译选项来使类型长度固定?

c types linux-kernel compilation
1个回答
0
投票

C 标准指定了“stdint.h”头文件/库文件(您可以使用类似

#include <stdint.h>
的行将其合并到代码中),该文件提供“固定宽度”整数类型的定义。

来自本 C11 标准草案

7.20 整数类型
<stdint.h>

1      标头

<stdint.h>
声明了一组 具有指定宽度的整数类型,并定义相应的集合 的宏。它还定义了指定整数限制的宏 与其他标准头文件中定义的类型相对应的类型。

使用此标头,您可以访问

int64_t
uint8_t
等类型;来自同一标准草案部分:

7.20.1.1 精确宽度整数类型

1      typedef 名称

intN_t
指定一个带符号的 宽度为 N、无填充位和二进制补码的整数类型 表示。因此,
int8_t
表示这样一个有符号整数类型 正好 8 位的宽度。

© www.soinside.com 2019 - 2024. All rights reserved.