在 C/C++ 之中为什么应该建议使用C函数库定义的基础数值类型,而不是编译默认的关键字类型?
本文的阐述的问题如标题所示:
相信有过多种平台、编译器的 C/C++ 程序开发的童鞋深有同感,在不同的 C/C++ 编译器及平台之中,INT、LONG的长度可能都是不一样的,这可能会带来编程及运行时上面的一些疑难问题。
在IBM-S390X之中,INT在字符打印时,GCC编译器警告或会告诉你它占用非公标的13字节,你没看错不是2字节不是4字节,是13个字节,有时看上去运行不会存在问题,具有一定的麻痹性。
那么INT/LONG型呢?我记得在某一个平台上的 GCC 编译器这个东西是12字节来着,反正是遇到过的,总之人当时是有点麻木且懵逼的,因为这个问题并不好找。
虽然,我们可以忽略不计这种问题,毕竟字节多点就多点,总比少点就2个字节要好得多,但是严格意义的来说,在C/C++之中,我们不应该直接使用关键字的 INT、LONG 基础数值类型。
而是应该严格的使用,由目标平台编译器导出定义的基础类型,如:
int8_t、uint8_t、int32_t、uint32_t、int64_t、uint64_t、double_t、uint16_t、int16_t 等。
这样,可以确保我们在任何操作系统及编译器平台上面,编写的相同代码执行效果是一致性的,因为有些代码是通过二进制的算术溢出的来处理的,尤其是位运算对于数值的字节长度是非常敏感的,一旦字节数不同运行的预期结果就会合实际实现的不同,尤其是跨平台的应用程序开发,人们很难再所有的平台上面都能确保其运转无误,因为测试成本是非常昂贵的。
当你吃过毒打,把所有的INT、LONG、SHORT类型全部都改一次的时,你就知道开发的时候,老老实实用C语言标准库导出的基础数值类型是多么让人喜爱,即便这样的规定会让人感到痛苦万分,那只是你没有遭受过剧烈且刻苦铭心的毒打。
虽然在现在主流的编译器之中,如:GCC、CLANG、MSVCRT(CC),INT/LONG的长度基本都被约定不低于四个字节(DWORD),但可从来没说过,它不可以超过四个字节(DWORD),在某一个或几个平台上面统一,并不意味着所有的编译器及目标平台都是统一的,人们应当确保代码是一次性,尽可能可以移植到所有平台上,无需修改,重复调试直接稳定且可靠的运行。
另外使用C语言标准库导出的基础数值类型,具备统一性,基本上大家一看就懂,清晰及明了度是没有问题的,但是你自己单独在整一套类型,那就不一定了。