我见过几个库和一些提供编译器独立类型的 C++ 头文件,但我不太明白为什么它们独立于编译器。
例如:
int Number; // Not compiler Independent
typedef unsigned int U32;
U32 Number2; // Now this is compiler independent
以上是真的吗?如果是这样,为什么?我不太明白为什么使用 typedef 意味着 Number2 的大小在编译器中是相同的。
我见过几个库和一些提供编译器独立类型的 C++ 头文件,但我不太明白为什么它们独立于编译器。
例如:
int Number; // Not compiler Independent
typedef unsigned int U32;
U32 Number2; // Now this is compiler independent
以上是真的吗?如果是这样,为什么?我不太明白为什么使用 typedef 意味着 Number2 的大小在编译器中是相同的。
我假设您的意思是类型与unsigned int Number
.
但是不,这些是完全一样的。两个声明Number
和Number2
具有相同的类型。两者都不比另一个更独立于编译器。
但是,使用typedef
这样的点是为了使库的开发人员可以轻松更改所有使用U32
. 例如,如果它们位于 anunsigned int
不是 32 位而是 an 的unsigned long
系统上,则可以将其更改typedef
为:
typedef unsigned long U32;
事实上,可以使用构建系统typedef
根据目标平台有条件地更改。
但是,如果您想要一种很好的标准化方法来确保该类型是 32 位无符号整数类型,我建议std::uint32_t
从<cstdint>
标头中使用。但是,如果您使用的机器没有 32 位整数类型,则不保证存在此类型。相反,您可以使用std::uint_least32_t
,它将为您提供至少 32 位的最小整数类型。
细化评论,
建议:使用 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。
免责声明:我没有编译它!
如评论中所述,显示的 typedef 不是独立于编译器的。
如果您想要一种独立于编译器的方式来获得固定大小,您可能需要使用cstdint。这个头文件实际上随您的编译器一起提供,并确保您有一个最小大小,但对于更大的类型(64 位、128 位)没有最大值。
如果您想完全确定您的类型的所有尺寸,您需要检查它。