编译器独立类型

时间:2013-04-17 23:20:07

标签: c++

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

例如:

int Number; // Not compiler Independent

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

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

3 个答案:

答案 0 :(得分:1)

我假设您的类型与unsigned int Number相同。

但不,这些完全一样。声明NumberNumber2都具有相同的类型。编译器与其他编译器无关。

然而,使用这样的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位)没有最大值。

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