警告:格式'%llx'需要'long long unsigned int *'类型的参数,但参数3的类型为'off64_t *'[ - Wformat]

时间:2014-02-05 10:53:04

标签: c linux 64-bit

当我在Linux x64下编译我的代码时(在x86下没有警告)我收到以下警告warning: format ‘%llx’ expects argument of type ‘long long unsigned int *’, but argument 3 has type ‘off64_t *’ [-Wformat]

我的代码段:

if(maps && mem != -1) {
        char buf[BUFSIZ + 1];

        while(fgets(buf, BUFSIZ, maps)) {
                off64_t start, end;

                sscanf(buf, "%llx-%llx", &start, &end);
                dump_region(mem, start, end);
        }
}

我应该如何施展它以获得警告?

编辑:

我应该这样投射吗?:

sscanf(buf, "%llx-%llx", (long long unsigned int *)&start, (long long unsigned int *)&end);

2 个答案:

答案 0 :(得分:1)

使用sscanf()来读取非标准整数类型(如off64_t)时会想到2种方法。

1)尝试通过各种条件(#if ...)来判断正确的格式说明符并使用sscanf()。假设它低于SCNx64

 #include <inttypes.h>
 off64_t start, end;
 if (2 == sscanf(buf, "%" SCNx64 "-%" SCNx64, &start, &end)) Success();

2)使用最大的sscanf()并在之后进行转换。

 #include <inttypes.h>
 off64_t start, end;
 uintmax_t startmax, endmax;
 if (2 == sscanf(buf, "%" SCNxMAX "-%" SCNxMAX, &startmax, &endmax)) Success();

 start = (off64_t) startmax;
 end   = (off64_t) endmax;

 // Perform range test as needed
 if start != startmax) ...

顺便说一句:对PRI...使用SCN...的建议应为scanf()PRI...适用于printf()家庭。

检查sscanf()结果总是好的。

答案 1 :(得分:0)

似乎我到目前为止找到的最佳方式是施放:

#if __GNUC__
  #if __x86_64__ || __ppc64__
    #define ENV64BIT
    #define _LARGEFILE_SOURCE
    #define _FILE_OFFSET_BITS 64
  #else
    #define ENV32BIT
  #endif
#endif

然后

#if defined(ENV64BIT)
    sscanf(buf, "%llx-%llx", (long long unsigned int *)&start, (long long unsigned int *)&end);
#else
    sscanf(buf, "%llx-%llx", &start, &end);
#endif