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

时间:2011-01-09 05:08:49

标签: c types macros size c-preprocessor

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

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

3 个答案:

答案 0 :(得分:4)

C对这些标准typedefs。不要定义自己的。它们被称为intN_tuintN_t,其中N为8,16,32,64等。包括<stdint.h>以获取它们。

如果您使用的是一个缺少stdint.h的古老编译器,那么您可以为自己使用的任何破坏平台提供适当的typedef。我会在没有stdint.h的情况下在任何非嵌入式目标上下注:

  • CHAR_BIT是8。
  • sizeof(char)是1.&lt; - 我会更加关注这个......; - )
  • sizeof(short)是2。
  • sizeof(int)是4。
  • sizeof(long long),如果类型存在,则为8。

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

答案 1 :(得分:0)

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

答案 2 :(得分: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);

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