根据这个答案,我尝试打印一个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工具链失败了,这使得它最初变得更加困惑.
PRIu64
未定义您使用它的位置.
将其替换为字符串"llu"
,您的代码将编译(但这不是修复,它只是演示了问题)
也许include
是失踪了.也许超过狂热者包括守卫并且它被包括在内而没有魔法标记阻挡define
.也许你的pch被破坏了.
归档时间: |
|
查看次数: |
23986 次 |
最近记录: |