平台格式没有警告

这个问题在这里已经有了答案:

  • 独立于平台的size_t c中的格式说明符 3个答案

  • 对于size_t ,假设您有足够现代的C库,请使用%zu

    如果您不能使用z修饰符(某些较旧的库不幸地不支持它),请在打印时将其转换为足够宽的已知类型,然后使用适合该类型的宽度说明符:

    size_t sz = sizeof(whatever);
    ...
    printf("%lu", (unsigned long)sz);
    

    只要你从来没有使用过大于40亿的大小,即可以容纳32位的数据,它就可以工作。 如果你在size_t为64位但long为32的系统上,理论上你已经知道size_t可以容纳的大小,但%lu不能打印。 对于你来说这是否是一个问题,如果是这样,该怎么办,取决于你。 (如果你的库支持它,理想的解决方案是返回到%zu ,这是首选的解决方案,并且在32位,64位或任何其他大小的环境中都没有这个问题。或者我猜你可以使用unsigned long long%llu 。)


    通过使用显式大小的整数而不是本地数据类型,可以避免此特定警告。

    #include <cstdint>
    
    int8_t a = 15; //usually an alias for char
    uint16_t b = 4980; //usually an alias for unsigned short
    uint32_t c = 1234567890; //usually an alias for unsigned int or unsigned long
    int64_t d = 908070605040302010ll; //usually an alias for long long
    

    具有大小整数的技巧是,例如,如果一个平台上的long为32位,而另一个平台上的long为64位,则long任何用法都是不可移植的。 但是int64_t始终为64位,否则它在给定平台上将不存在。

    具体来说,你的代码似乎假设size_t将始终为64位,但不能保证。 所以你应该使用uint64_t来代替它,它保证了它最终使用的任何底层数据类型,它将是64位(和unsigned,这是size_t唯一的保证)。

    链接地址: http://www.djcxy.com/p/72223.html

    上一篇: platform format without warnings

    下一篇: Portable printf format specifier for 64 bit hexadecimal?