【问题标题】:Checking type sizes in C with macros使用宏检查 C 中的类型大小
【发布时间】:2023-04-11 03:28:01
【问题描述】:

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

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

【问题讨论】:

    标签: c types macros size c-preprocessor


    【解决方案1】:
       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 位整数,它就不能独立于平台。

    【讨论】:

      【解决方案2】:

      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。

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

      【讨论】:

      • inttypes.h 也很容易与这些类型一起使用。这些头文件肯定在 POSIX 中,但我不知道它们也在 C 标准中。整洁。
      • 如果古代编译器恰好是 MSVC,你可以使用这个:msinttypes.googlecode.com/svn/trunk/stdint.h
      • 如果您使用标准整数类型作为填充,您还应该使用预处理器来验证正确的范围:#if UINT_MAX != 0xFFFFFFFF␤#error "int is not 32-bit"␤#endif
      【解决方案3】:

      您甚至无法保证所有这些类型都存在在您的平台上(比如说,甚至可能没有 64 位整数),所以您可以'不可能编写独立于平台的代码来在编译时检测它们。

      【讨论】:

      • 我知道 64 位整数在某些平台上会出现问题。
      • 嗯,它不仅仅是 64 位——如果您真正编写独立于平台的 C 代码,那么可以保证sizeof(long long int) >= sizeof(long int) >= sizeof(short int)... 但是出于所有实际目的,它们都可以是 16 位的!所以你必须先假设一些非标准的东西才能写出这样的代码。
      • 没有。 C 要求 ULONG_MAX 至少为 2^32-1,ULLONG_MAX 至少为 2^64-1。
      • 这很有趣——我特别记得在我的 C 书中读到,唯一的保证就是我写的那个。不过,看起来你是对的;有趣的是这本书是错的......
      • 该死的,我正在使用 pstdint。
      猜你喜欢
      • 2013-12-08
      • 2011-06-10
      • 2018-10-30
      • 1970-01-01
      • 2011-12-02
      • 2011-04-30
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多