如何使用 stdint.h 的 int64_t 变量(cpcheck 认为它是有符号整数)防止 %"PRIi64" (%lld) 的 cppcheck (v1.72) 警告

Posted

技术标签:

【中文标题】如何使用 stdint.h 的 int64_t 变量(cpcheck 认为它是有符号整数)防止 %"PRIi64" (%lld) 的 cppcheck (v1.72) 警告【英文标题】:How to prevent cppcheck (v1.72) warnings for %"PRIi64" (%lld) with a int64_t variable (cpcheck thinks it is a signed int) of stdint.h 【发布时间】:2016-03-15 08:14:47 【问题描述】:

对于一个序列

typedef  int64_t     I64;
I64 i=5;
printf("%"PRIi64",i);

cppcheck 给出以下警告:

警告:格式字符串(第 1 号)中的 %lld 需要“long long”,但参数类型为“signed int”。

makro PRIi64 被 lld 解析,这是正确的,但是不接受 64 位整数类型作为 long long int。

我希望有办法解决这个问题,因为我们在项目中收到了很多这样的警告,并且再也看不到真正的错误了。

【问题讨论】:

“无关报价”是什么意思? “PRIi64”取自“inttypes.h”(C99),通常需要编写 32/64 位独立代码,因为对于 int64_t (stdint.h),您需要 32 位引擎上的 %lld 和 64 位引擎上的 %ld。 是的,但这与我的真正问题无关。这里更正确: printf("somthing %"PRIi64" else",i); 【参考方案1】:

最新版本的 Cppcheck 没有显示关于以下示例代码的警告:

void f(void)

    typedef int64_t I64;
    I64 i=5;
    printf("%"PRIi64",i);

【讨论】:

以上是关于如何使用 stdint.h 的 int64_t 变量(cpcheck 认为它是有符号整数)防止 %"PRIi64" (%lld) 的 cppcheck (v1.72) 警告的主要内容,如果未能解决你的问题,请参考以下文章

uint32_t 和 u_int32_t 的区别

keil MDK-ARM 如何实现64位加法

解决办法:error: unknown type name ‘__int64‘

001:数据类型头文件

编译错误:“stdint.h:没有这样的文件或目录”

C99 stdint.h 头文件和 MS Visual Studio