GCC 4.6.3 vs 4.7.3:为x86_64打印greg_t的差异

时间:2013-05-21 22:25:03

标签: c gcc gcc4.7 gcc4.6

我正在尝试修复构建错误。

违规行代码如下:

fprintf(crashLog, "RIP: %lX\n", context->uc_mcontext.gregs[REG_RIP]);

因此:

  • gregs的类型为gregset_t
  • gregs [i]的类型为greg_t

现在这段代码(用于生成核心转储和堆栈跟踪)已经工作了很长时间,但最近,GCC 4.7.3(Ubuntu 13.04)已经开始拒绝它:

error: format ‘%lX’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘greg_t {aka long long int}’ [-Werror=format]

精细。所以我将违规行更改为:

fprintf(crashLog, "RIP: %llX\n", context->uc_mcontext.gregs[REG_RIP]);

但GCC 4.6.3(Ubuntu 12.04)反而抱怨:

error: format ‘%llX’ expects argument of type ‘long long unsigned int’, but argument 3 has type ‘greg_t {aka long int}’ [-Werror=format]

在这段代码中已经有ifdef用于各种寄存器,所以我可以添加另一个,但有一个很好的干净方法(特别是不需要额外的ifdef)吗?

0 个答案:

没有答案