31

根据这个答案,我尝试打印 a 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

4 回答 4

28

在 C++ 中,宏不会仅通过包含文件来自动定义。

您需要添加以下内容:

#define __STDC_FORMAT_MACROS 1

#include <inttypes.h>

如何打印 uint64_t?失败:“格式中的虚假尾随 '%'”

于 2013-09-10T12:38:37.883 回答
24

我刚刚在自己的代码中发现此问题的另一种可能性是,如果<inttypes.h> 您定义__STDC_FORMAT_MACROS. 例如:

Utils.h(也许最初是为 C 编写的,就像我们的例子一样):

#include <inttypes.h>

// ... Function declarations

我的文件.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 工具链上失败了,这使得它一开始更加令人困惑。

于 2015-06-15T17:22:03.047 回答
4

PRIu64没有定义你使用它的地方。

用字符串替换它,"llu"您的代码将编译(但这不是修复,它只是演示了问题)

也许include缺少了。也许超过 zealos 包括守卫,并且它被包含在没有魔法令牌的情况下阻止define. 也许你的 pch 坏了。

于 2013-01-26T10:27:26.933 回答
2

如果你在 android JNI 平台上。把它放在你的 Android.mk 中:

LOCAL_CPPFLAGS := -D__STDC_FORMAT_MACROS
于 2018-08-14T16:16:50.550 回答