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

Mas*_*Man 23 c++ printf c++03

根据这个答案,我尝试打印一个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() {}
Run Code Online (Sandbox Code Playgroud)

这个最小的代码编译,但我的实际代码没有.但是,我尝试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"
Run Code Online (Sandbox Code Playgroud)

小智 24

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

您需要添加以下内容:

#define __STDC_FORMAT_MACROS 1
Run Code Online (Sandbox Code Playgroud)

之前

#include <inttypes.h>
Run Code Online (Sandbox Code Playgroud)

如何printf uint64_t?失败:"格式中的虚假尾随'%'


Col*_*lin 18

我刚才在我自己的代码中找到的另一个问题是,如果在定义<inttypes.h> 之前已经引入了另一个头__STDC_FORMAT_MACROS.例如:

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

#include <inttypes.h>

// ... Function declarations
Run Code Online (Sandbox Code Playgroud)

MyFile.cpp:

#include "Utils.h"

#define __STDC_FORMAT_MACROS
#include <inttypes.h>
Run Code Online (Sandbox Code Playgroud)

由于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>
Run Code Online (Sandbox Code Playgroud)

原始设置实际上在Ubuntu上的GCC 4.8上编译得很好,但是在PowerPC上使用旧的ltib GCC 4.3工具链失败了,这使得它最初变得更加困惑.


Yak*_*ont 5

PRIu64 未定义您使用它的位置.

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

也许include是失踪了.也许超过狂热者包括守卫并且它被包括在内而没有魔法标记阻挡define.也许你的pch被破坏了.