0

我见过几个库和一些提供编译器独立类型的 C++ 头文件,但我不太明白为什么它们独立于编译器。

例如:

int Number; // Not compiler Independent

typedef unsigned int U32;
U32 Number2; // Now this is compiler independent

以上是真的吗?如果是这样,为什么?我不太明白为什么使用 typedef 意味着 Number2 的大小在编译器中是相同的。

4

3 回答 3

1

我假设您的意思是类型与unsigned int Number.

但是不,这些是完全一样的。两个声明NumberNumber2具有相同的类型。两者都不比另一个更独立于编译器。

但是,使用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 位的最小整数类型。

于 2013-04-17T23:28:11.563 回答
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。

免责声明:我没有编译它!

于 2013-04-17T23:28:34.477 回答
0

如评论中所述,显示的 typedef 不是独立于编译器的。

如果您想要一种独立于编译器的方式来获得固定大小,您可能需要使用cstdint。这个头文件实际上随您的编译器一起提供,并确保您有一个最小大小,但对于更大的类型(64 位、128 位)没有最大值。

如果您想完全确定您的类型的所有尺寸,您需要检查它。

于 2013-04-17T23:28:31.643 回答