我正在编写一个程序,该程序需要具有确定大小的无符号类型。我需要一个uint8,uint16,uint32和uint64,并且我需要在types.h中定义它们,以便无论平台如何,它们都将始终正确定义。
我的问题是,如何使用预处理器宏在每个平台上检查不同类型的大小,以便可以在types.h标头中正确定义我的自定义类型?
C具有这些的标准typedefs
。不要定义自己的。它们分别称为intN_t
和uintN_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。因此只需将它们用作损坏系统的填充物。
您甚至无法保证所有这些类型都会在您的平台上exist(例如,甚至可能甚至没有be 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,它们在编译时静态声明大小。就像@Mehrdad一样,如果目标没有64位整数,则不能独立于平台。