我正在编写一个需要具有明确大小的无符号类型的程序。我需要一个uint8,uint16,uint32和uint64,我需要在types.h中定义它们,无论平台如何,它们都将被正确定义。
我的问题是,如何使用预处理器宏检查每个平台上不同类型的大小,以便我可以在types.h头中正确定义自定义类型?
答案 0 :(得分:4)
C对这些标准typedefs
。不要定义自己的。它们被称为intN_t
和uintN_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位整数,则不能独立于平台。