gpt4 book ai didi

c - 数据类型大小 - 想知道一篇好文章

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:07 25 4
gpt4 key购买 nike

我刚刚读了一篇很棒的文章,Portable Fixed-Width Integers in C , 直到接近尾声,一切都非常合理,我想知道以下段落是什么意思:

当然,如果您还没有兼容 C99 的编译器,您仍然必须编写自己的一组 typedef,使用 char、short 和 long 基本宽度的特定于编译器的知识。我建议将这些 typedef 放在您自己设计的头文件中,并将 list 2 中所示的匿名 union 声明添加到链接的源模块以检查它们的大小;也就是说,温和地“提醒”任何人有一天可能会承担移植您的代码的任务。

static union
{
char int8_t_incorrect[sizeof( int8_t) == 1];
char uint8_t_incorrect[sizeof( uint8_t) == 1];
char int16_t_incorrect[sizeof( int16_t) == 2];
char uint16_t_incorrect[sizeof(uint16_t) == 2];
char int32_t_incorrect[sizeof( int32_t) == 4];
char uint32_t_incorrect[sizeof(uint32_t) == 4];
};

list 2. 这个匿名 union 允许编译器检测和报告 typedef 错误

我试验了一个小程序:

typedef unsigned char  int8_t;
typedef unsigned short int16_t;

union u {
char int8_incorrect[sizeof(int8_t)==1];
char int16_incorrect[sizeof(int16_t)==2];
};


int main() {
return 0;
}

编译器没有问题。我将 int8_t 更改为以下内容:

typedef unsigned int  int8_t;

也没有问题。

基本上我错过了为什么这个示例代码可以检测到错误。

你能澄清我错过了什么吗?

最佳答案

如果您使用 gcc 编译,请将 -std=c89 -pedantic-std=c99 pedantic 添加到您的 gcc 编译选项以使用此 typedef 和 union 类型获取警告:

typedef unsigned int  int8_t;

对于这个类型定义:

typedef unsigned char int8_t;

您没有收到任何警告是正常的,因为诀窍是检查类型的大小,而不是检查它是有符号类型还是无符号类型。

关于c - 数据类型大小 - 想知道一篇好文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9457552/

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