【问题标题】:gcc compile error for SCNu64 in GCC 4.4.x only仅在 GCC 4.4.x 中 SCNu64 的 gcc 编译错误
【发布时间】:2018-03-19 03:54:00
【问题描述】:

使用 GCC 4.4.7 编译主机范围 (http://www.maier-komor.de/hostscope.html) 时出现错误

操作系统:

[xtrnaw7@centos69 hostscope-V2.1]$ uname -a
Linux centos69 2.6.32-696.13.2.el6.x86_64 #1 SMP Thu Oct 5 21:22:16 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

使用的 GCC 版本:

gcc (GCC) 4.4.7 20120313(红帽 4.4.7-18)

[xtrnaw7@centos69 hostscope-V2.1]$ make
g++ -MM -g -Wall -DWFC -DVERSION=\"V2.1\"  linuxdisk.cc > build/linuxdisk.d
g++ -g -O2 -Wall -DWFC -DVERSION=\"V2.1\" -c linuxdisk.cc -o build/linuxdisk.o
linuxdisk.cc: In function ‘void read_diskinfo(HostScope*)’:
linuxdisk.cc:187: error: expected ‘)’ before ‘SCNu64’
linuxdisk.cc:199: warning: spurious trailing ‘%’ in format
linuxdisk.cc:199: warning: too many arguments for format
make: *** [build/linuxdisk.o] Error 1
[xtrnaw7@centos69 hostscope-V2.1]$ 

gcc 抱怨的那一行是

182         uint64_t ts = get_us_time();
183         char *at = buf;
184         for (;at && *at;) {
185                 uint64_t nrd, nmrd, nsecrd, msrd, nwr, nmwr, nsecwr, mswr, niop, msio, wmsio;
186                 char dev[32];
187                 int f = sscanf(at,"%*u %*u %31s %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 ""
188                                 , dev
189                                 , &nrd
190                                 , &nmrd
191                                 , &nsecrd
192                                 , &msrd
193                                 , &nwr
194                                 , &nmwr
195                                 , &nsecwr
196                                 , &mswr
197                                 , &niop
198                                 , &msio
199                                 , &wmsio);
200                 if (f == 0)
201                         return;
202                 at = strchr(at,'\n');

此源文件中的包含是

#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

而 SCNu64 是在 inttypes.h 中定义的

[xtrnaw7@centos69 hostscope-V2.1]$ grep SCNu64 /usr/include/inttypes.h 
# define SCNu64     __PRI64_PREFIX "u"

主机范围与其他 GCC 版本一起编译时不会出错,例如

gcc (GCC) 6.4.1 20170727(红帽 6.4.1-1)

gcc (GCC) 4.8.5 20150623(红帽 4.8.5-16)

gcc (GCC) 5.3.1 20160406(红帽 5.3.1-6)

但不适用于 GCC 4.4.7

有什么线索吗?

【问题讨论】:

标签: gcc


【解决方案1】:

米哈伊尔的回答解决了问题

尝试定义 __STDC_FORMAT_MACROS 或将 -D__STDC_FORMAT_MACROS 添加到 g++ 标志 在 Makefile 中

非常感谢

伯纳德

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多