format ‘%lu’ expects argument of type ‘long unsigned int’……

打印问题,这种报错一看就是输出格式与变量不匹配,先引用前人的文章简单说明下%d %ld %lld , %u %lu %llu , %x %lx %llx的区别icon-default.png?t=N4P3https://www.cnblogs.com/KingZhan/p/16425831.html



首先说明,不同平台下不一样!    下面说的是arm 32位平台的

 
%d 输出有符号32位的

%ld 输出有符号32位的

%lld 输出有符号64位的
 

%u 输出无符号32位的

%lu 输出无符号32位的

%llu 输出无符号64位的

 
%x 输出32位16进制数的

%lx 输出32位16进制数的

%llx 输出64位16进制数的

我们一般在大型项目中涉及这些打印输出的时候,往往需要针对不同的target进行匹配,所以也就出现了针对不同target自动匹配的宏定义格式:

-------------------------------------------------
//类型定义
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
typedef unsigned long long uint64_t;
typedef unsigned long   uintptr_t;

typedef signed char     int8_t;
typedef short           int16_t;
typedef int             int32_t;
typedef long long       int64_t;
typedef long            intptr_t;

-------------------------------------------------
//打印前缀
#define PRId32 "d"
#define PRIu32 "u"
#define PRIx32 "x"
#define PRIX32 "X"
#define PRId64 "lld"
#define PRIu64 "llu"
#define PRIx64 "llx"
#define PRIX64 "llX"
-------------------------------------------------
//依据不同平台,定义target

# define TARGET_LONG_BITS             64
或
# define TARGET_LONG_BITS             32

#define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8)


#if TARGET_LONG_SIZE == 4        

    typedef int32_t target_long;
    typedef uint32_t target_ulong;

    #define TARGET_FMT_lx "%08x"
    #define TARGET_FMT_ld "%d"
    #define TARGET_FMT_lu "%u"

#elif TARGET_LONG_SIZE == 8

    typedef int64_t target_long;
    typedef uint64_t target_ulong;

    #define TARGET_FMT_lx "%016" PRIx64
    #define TARGET_FMT_ld "%" PRId64
    #define TARGET_FMT_lu "%" PRIu64
#else
    #error TARGET_LONG_SIZE undefined
#endif

这样我们在具体打印时,直接用相应的语句拼写即可:

printf("nip=0x"TARGET_FMT_lx, cpu->env.nip);

fprintf(stderr, "nip=0x"TARGET_FMT_lx, cpu->env.nip);                                                                                                                                                  

error_report("nip=0x"TARGET_FMT_lx, cpu->env.nip)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值