使用宏检查C中的字体大小

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

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

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

c types macros size c-preprocessor
3个回答
4
投票

C具有这些的标准typedefs。不要定义自己的。它们分别称为intN_tuintN_t,其中N为8、16、32、64等。请添加<stdint.h>以获得它们。

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

  • CHAR_BIT是8。
  • sizeof(char)为1。
  • sizeof(short)是2。
  • sizeof(int)是4。
  • [sizeof(long long),如果存在该类型,则为8。

因此只需将它们用作损坏系统的填充物。


0
投票

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


0
投票
   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,它们在编译时静态声明大小。就像@Mehrdad一样,如果目标没有64位整数,则不能独立于平台。

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