根据this answer,我尝试打印uint64_t
,但它给了我一个错误:
错误:在'PRIu64'之前预期``)'
以下是显示我要做的事情的最小代码:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <cstdio>
class X {
X() {
uint64_t foo = 0;
printf("%07" PRIu64 ": ", foo);
}
};
int main() {}
这个最小的代码编译,但我的实际代码没有。但是,我尝试使用X::X()
中的2行与我的实际代码完全相同,但这不起作用。
我应该寻找什么来进一步调试?我的实际代码也是#include
个其他标题。这会导致问题吗?包含标题的顺序是否重要?
修改
PRIu64
在我的机器上定义如下:
# if __WORDSIZE == 64
# define __PRI64_PREFIX "l"
# define __PRIPTR_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# define __PRIPTR_PREFIX
# endif
# define PRIu64 __PRI64_PREFIX "u"
答案 0 :(得分:24)
在C ++中,只有包含文件才能自动定义宏。
您需要添加以下内容:
#define __STDC_FORMAT_MACROS 1
前
#include <inttypes.h>
How to printf uint64_t? Fails with: "spurious trailing ‘%’ in format"
答案 1 :(得分:17)
我刚才在我自己的代码中找到的另一个问题是,在定义<inttypes.h>
之前,另一个标头是否已经引入__STDC_FORMAT_MACROS
。例如:
Utils.h (也许最初是为C编写的,就像我们的情况一样):
#include <inttypes.h>
// ... Function declarations
<强> MYFILE.CPP 强>:
#include "Utils.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
由于inttypes.h
已包含Util.h
,编译器不会再次包含它,也看不到__STDC_FORMAT_MACROS
的声明。
解决方案是编辑Utils.h
以包含#define __STDC_FORMAT_MACROS
,或确保在MyFile.cpp
中执行任何包含之前定义它。
#define __STDC_FORMAT_MACROS
#include "Utils.h"
#include <inttypes.h>
原始设置实际上在Ubuntu上的GCC 4.8上编译得很好,但是在PowerPC上使用旧的ltib GCC 4.3工具链失败了,这使得它最初变得更加令人困惑。
答案 2 :(得分:5)
PRIu64
未在您使用它的地方定义。
将其替换为字符串"llu"
,您的代码将编译(但这不是修复,它只是演示了问题)
可能缺少include
。也许超过zealos包括守卫并且它被包括在内而没有魔法标记阻挡define
。也许你的pch被破坏了。
答案 3 :(得分:0)
如果您在android JNI平台上。将其放在您的Android.mk中:
LOCAL_CPPFLAGS := -D__STDC_FORMAT_MACROS