当我在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);
答案 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