代码之家  ›  专栏  ›  技术社区  ›  Nick

FreeBSD下的奇怪转换警告

  •  1
  • Nick  · 技术社区  · 7 年前

    #include <sys/endian.h>
    
    int main(){
        uint64_t a = 100;
        be64toh(a);
    }
    

    当我尝试将其移植到FreeBSD下时,我得到:

    # gcc x.cc -Wall -Wconversion -Wpedantic -lstdc++ -std=c++11
    x.cc: In function 'int main()':
    x.cc:5:2: warning: conversion to '__uint16_t {aka short unsigned int}' from '__uint32_t {aka unsigned int}' may alter its value [-Wconversion]
      be64toh(a);
      ^
    x.cc:5:2: warning: conversion to '__uint16_t {aka short unsigned int}' from '__uint32_t {aka unsigned int}' may alter its value [-Wconversion]
    x.cc:5:2: warning: conversion to '__uint32_t {aka unsigned int}' from 'uint64_t {aka long unsigned int}' may alter its value [-Wconversion]
    

    我可以使用sys/endian.h以外的其他库吗

    1 回复  |  直到 7 年前
        1
  •  1
  •   Michael Zhilin    7 年前

    是的,“gcc-E”带来了答案。be64toh是内联函数的叠加,导致多个强制转换64->32->16.我想gcc希望告知此类转换。

       (__builtin_constant_p((
       a
       )) ? (((__uint64_t)(__builtin_constant_p(((__uint64_t)((
       a
       ))) & 0xffffffff) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(((__uint64_t)((
       a
       ))) & 0xffffffff)) >> 16)))) : __bswap32_var(((__uint64_t)((
       a
       ))) & 0xffffffff)) << 32) | (__builtin_constant_p(((__uint64_t)((
       a
       ))) >> 32) ? (((__uint32_t)((__uint16_t)(__builtin_constant_p(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) & 0xffff) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) & 0xffff)) << 8 | ((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) & 0xffff)) >> 8) : __bswap16_var(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) & 0xffff))) << 16) | ((__uint16_t)(__builtin_constant_p(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) >> 16) ? (__uint16_t)(((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) >> 16)) << 8 | ((__uint16_t)(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) >> 16)) >> 8) : __bswap16_var(((__uint32_t)(((__uint64_t)((
       a
       ))) >> 32)) >> 16)))) : __bswap32_var(((__uint64_t)((
       a
       ))) >> 32))) : __bswap64_var((
       a
       )))