编译器独立类型

Compiler Independent Types

本文关键字:类型 独立 编译器      更新时间:2023-10-16

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

例如:

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

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

详细说明评论,

建议:使用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

预处理器宏链是重要的部分,而不是类型定义。

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

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

但是不,它们是完全一样的。两个声明,NumberNumber2,具有相同的类型。两者都不是编译器独立的

然而,像这样使用typedef的目的是使库的开发人员可以轻松地更改所有使用U32的函数使用的整数类型。例如,如果他们在一个unsigned int不是32位的系统上,但unsigned long是32位的,他们可以将typedef更改为:

typedef unsigned long U32;

实际上,可以使用构建系统根据目标平台有条件地更改typedef

然而,如果你想要一个很好的标准化方法来确保类型是32位无符号整数类型,我建议使用<cstdint>头中的std::uint32_t。但是,如果您在一台没有32位整数类型的机器上,则不能保证该类型存在。相反,您可以使用std::uint_least32_t,它将提供至少32位的最小整数类型。

如注释所述,所示的typedef不是独立于编译器的。

如果你想要一种独立于编译器的方法来获得固定的大小,你可能想要使用cstdint。这个头文件实际上是编译器自带的,它保证了最小大小,但对于更大的类型(64位,128位)没有最大值。

如果你想完全确定你的字体的大小,你需要检查它