为什么PRIu64不能在此代码中工作?

时间:2013-01-26 09:25:19

标签: c++ printf c++03

根据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"

4 个答案:

答案 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