C 注:预计为&x2018;字符*uuu限制uu’;但参数的类型为‘;int8_t*’;
代码: 警告:C 注:预计为&x2018;字符*uuu限制uu’;但参数的类型为‘;int8_t*’;,c,gcc,C,Gcc,代码: 警告: int8_t ret; int8_t buf[8]; bytes_written = snprintf(buf, 8, "%" PRId8, 2); 我知道这可以通过将buf作为*char来解决,但是 int8_t的类型定义为无符号字符 使用预处理器输出进行检查,即gcc main.c|grep int8_t 那个么为什么编译器不能理解这一点呢 当buf作为uint8时,我也得到了同样的警告 编辑: int8_t是typedef作为有符号字符(我在原始帖子中错误地写为unsig
int8_t ret;
int8_t buf[8];
bytes_written = snprintf(buf, 8, "%" PRId8, 2);
我知道这可以通过将buf作为*char来解决,但是
int8_t的类型定义为无符号字符
使用预处理器输出进行检查,即gcc main.c|grep int8_t
那个么为什么编译器不能理解这一点呢
当buf作为uint8时,我也得到了同样的警告
编辑:
int8_t是typedef作为有符号字符(我在原始帖子中错误地写为unsigned)
sprintf
调用系列需要一个char*
缓冲区来写入数据
您当前将其命名为int8*
(一个有符号的8位值),并且它抱怨类型的有符号性这一事实几乎肯定意味着裸char
在您的系统上是无符号的(该标准对char
是否是有符号类型保持开放)或者说,gcc
足够聪明地意识到这可能是其他编译器的可移植性问题
请注意,这是一个警告,因此它可能仍然有效。然而,我喜欢清理这样的代码,以便让我的生活更轻松
当然,修复方法是使用正确的类型(将类型更改为
char buf[8]
,或者在snprintf
调用中显式强制转换它,从而告诉编译器您知道自己在做什么)。什么是PRId8
。如果对snprintf
的调用不是bytes\u writed=snprintf(buf,8,“%PRId8”,2)代码>?@ NISANT NO.<代码> PRID8是CPP宏。@ A3F AA::不,CPP是C++的缩写。@ NIANTENT没有那部分是正确的。看看@alk,那么G++预处理器被称为CPPPP?char
是一种不同于signed char
和unsigned char
的类型,不管怎样。@paxdiablo它对buf和uint8\t也给出了相同的警告。我正在用GCC编译代码,默认情况下将CHAR视为签名char
warning: pointer targets in passing argument 1 of ‘snprintf’ differ in signedness [-Wpointer-sign]
bytes_written = snprintf(buf, 8, "%" PRId8, 2);
^
/usr/include/stdio.h:386:12: note: expected ‘char * __restrict__’ but argument is of type ‘int8_t *’
extern int snprintf (char *__restrict __s, size_t __maxlen,