我见过几个提供编译器独立类型的库和一些C ++头文件,但我不明白为什么它们与编译器无关。
例如:
int Number; // Not compiler Independent
typedef unsigned int U32;
U32 Number2; // Now this is compiler independent
这是真的吗?如果是这样,为什么?我不太明白为什么使用typedef意味着Number2的大小在编译器中是相同的。
答案 0 :(得分:1)
我假设您的类型与unsigned int Number
相同。
但不,这些完全一样。声明Number
和Number2
都具有相同的类型。编译器与其他编译器无关。
然而,使用这样的typedef
是这样的,因此库的开发人员可以轻松地更改使用U32
的所有函数使用的整数类型。例如,如果他们所在的系统中unsigned int
不是32位,而是unsigned long
,则可以将typedef
更改为:
typedef unsigned long U32;
事实上,可以使用构建系统根据目标平台有条件地更改typedef
。
但是,如果您想要一种很好的标准化方法来确保该类型是32位无符号整数类型,我建议使用std::uint32_t
标题中的<cstdint>
。但是,如果您在没有32位整数类型的计算机上,则不保证存在此类型。相反,您可以使用std::uint_least32_t
,它将为您提供至少32位的最小整数类型。
答案 1 :(得分:1)
阐述评论,
命题:使用typedef实现编译器独立性。
理由:平台独立是一件好事
实施:
#ifdef _MSC_VER
#if _MSC_VER < 1400
typedef int bar;
#elif _MSC_VER < 1600
typedef char bar;
#else
typedef bool bar;
#else
#error "Unknown compiler"
#endif
预处理器宏链是typedef的重要部分。
免责声明:我还没编译过来!
答案 2 :(得分:0)
如评论中所述,显示的typedef与编译器无关。
如果您希望以编译器独立的方式获得固定大小,则可能需要使用cstdint。 这个头文件实际上是随你的编译器一起提供的,并确保你有一个最小的大小,但对于更大的类型(64位,128位)没有最大值。
如果您想完全确定类型的所有尺寸,则需要进行检查。