gpt4 book ai didi

c - ANSI C (C89) 中的 Stdint.h

转载 作者:行者123 更新时间:2023-12-02 16:34:31 25 4
gpt4 key购买 nike

我最近对从编写 C99 代码转向编写纯 ANSI C (C89) 感兴趣,因为该语言的新特性不值得用 ANSI 编写它的极端可移植性和可靠性C. 我认为从 C99 过渡到 C89 时我会错过的最大特性之一是 stdint.h 标准库文件;大概我是这么想的。根据this网站,C89标准中没有stdint.h文件,这也是我在Wikipedia上找到的。 .我想确保情况确实如此,所以我编写了一个最小的测试程序,我预计在提供标志 -ansi-pedantic-errors 时不会编译在 GCC 和 Clang 中;

#include <stdio.h>
#include <stdint.h>

int main(void)
{
printf("The size of an int8_t is %ld.\n", sizeof(int8_t));
printf("The size of an int16_t is %ld.\n", sizeof(int16_t));
printf("The size of an int32_t is %ld.\n", sizeof(int32_t));
printf("The size of an int64_t is %ld.\n", sizeof(int64_t));

printf("The size of a uint8_t is %ld.\n", sizeof(uint8_t));
printf("The size of a uint16_t is %ld.\n", sizeof(uint16_t));
printf("The size of a uint32_t is %ld.\n", sizeof(uint32_t));
printf("The size of a uint64_t is %ld.\n", sizeof(uint64_t));

return 0;
}

但是,我发现的不是编译器错误,也不是警告,而是编译的程序!由于它在任何一个编译器上都工作得很好,我假设这不是编译器中的错误。作为引用,输出是人们对有效的 C99 实现的期望:

The size of an int8_t is 1.
The size of an int16_t is 2.
The size of an int32_t is 4.
The size of an int64_t is 8.
The size of a uint8_t is 1.
The size of a uint16_t is 2.
The size of a uint32_t is 4.
The size of a uint64_t is 8.

我对这个“功能”有几个问题。

  • 我应该能够依赖为 C89 程序提供的 stdint.h header 吗?
  • 如果不是,我必须采取哪些步骤来创建功能与 stdint.h 相同的 header ?
  • 在 C99 之前的时间里,程序员是如何在与平台无关的庄园中解决他们的程序中整数的可靠大小这一问题的?

最佳答案

Should I be able to rely upon a stdint.h header being provided for a C89 program?

没有。你说你选择 C89 是出于可移植性的原因,然后你首先要做的是不可移植的扩展......

If not, what steps would I have to take in creating a header that functions the same as stdint.h?

How did programmers, in the time before C99, solve this problem of having reliable sizes for integers in their programs in a platform-agnostic manor?

使用大量宏,例如 this answer .如果是 C89,您可以typedef 给定平台的 stdint.h 中存在的所有名称。否则,如果是标准 C,您只需包含 stdint.h。

因此您需要自己的“notstdint.h”,其中包含所有这些,然后您必须将它移植到整数大小不同的每个系统。是的,这使得 C89 的可移植性不如标准 C。

关于c - ANSI C (C89) 中的 Stdint.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62937049/

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