使用宏检查 C 中的类型大小

发布于 2024-10-11 05:34:26 字数 171 浏览 1 评论 0原文

我正在编写一个程序,需要具有确定大小的无符号类型。我需要 uint8、uint16、uint32 和 uint64,并且需要在 types.h 中定义它们,无论平台如何,它们都将始终被正确定义。

我的问题是,如何使用预处理器宏检查每个平台上不同类型的大小,以便我可以在 types.h 标头中正确定义自定义类型?

I'm writing a program that needs to have unsigned types with definite sizes. I need a uint8, uint16, uint32, and uint64, and I need them defined in types.h, in a way that they will always be defined correctly regardless of platform.

My question is, how can I check the sizes of different types on each platform using preprocessor macros, so that I can define my custom types correctly in the types.h header?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不语却知心 2024-10-18 05:34:26

C 有针对这些的标准 typedefs。不要定义你自己的。它们称为 intN_tuintN_t,其中 N 为 8、16、32、64 等。 来获取它们。

如果您使用的是缺少 stdint.h 的古老编译器,您可以简单地为您自己的编译器提供适当的 typedef,以适应您正在使用的任何损坏的平台。我敢打赌,在没有 stdint.h 的情况下遇到的任何非嵌入式目标:

  • CHAR_BIT 是 8。
  • sizeof(char) 是 1。 < ;-- 我会在这个上打更多赌注... ;-)
  • sizeof(short) 是 2。
  • sizeof(int) 是 4。
  • sizeof (long long),如果该类型存在,则为 8。

因此,只需使用这些作为损坏系统的填充即可。

C has standard typedefs for these. Do not define your own. They are called intN_t and uintN_t where N is 8, 16, 32, 64, etc. Include <stdint.h> to get them.

If you're using an ancient compiler that lacks stdint.h, you can simply provide your own with the appropriate typedefs for whatever broken platform you're working with. I would wager that on any non-embedded target you encounter without stdint.h:

  • CHAR_BIT is 8.
  • sizeof(char) is 1. <-- I'd wager even more on this one... ;-)
  • sizeof(short) is 2.
  • sizeof(int) is 4.
  • sizeof(long long), if the type exists, is 8.

So just use these as fill-ins for broken systems.

小女人ら 2024-10-18 05:34:26
   312 #define SDL_COMPILE_TIME_ASSERT(name, x)               \

   313        typedef int SDL_compile_time_assert_ ## name[(x) * 2 - 1]


   316 SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);

   317 SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);

   318 SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);

   319 SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);

   320 SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);

   321 SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);

   322 SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);

   323 SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);

查看 SDL https://hg.libsdl.org/SDL/ file/d470fa5477b7/include/SDL_stdinc.h#l316 它们在编译时静态断言大小。就像 @Mehrdad 所说,如果您的目标没有 64 位整数,则不能独立于平台。

   312 #define SDL_COMPILE_TIME_ASSERT(name, x)               \

   313        typedef int SDL_compile_time_assert_ ## name[(x) * 2 - 1]


   316 SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);

   317 SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);

   318 SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);

   319 SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);

   320 SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);

   321 SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);

   322 SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);

   323 SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);

Checkout SDL https://hg.libsdl.org/SDL/file/d470fa5477b7/include/SDL_stdinc.h#l316 they statically assert size at compile time. Like @Mehrdad say is can't be platform independant if your target doesn't have 64 bits integer.

半衬遮猫 2024-10-18 05:34:26

您甚至无法保证所有这些类型都存在在您的平台上(例如,甚至可能没有 64位整数),因此您不可能编写与平台无关的代码以在编译时检测它们。

You can't even guarantee that all those types will exist on your platform (say, there might not even be a 64-bit integer), so you can't possibly write platform-independent code to detect them at compile-time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文