代码:
int8_t ret;
int8_t buf[8];
bytes_written = snprintf(buf, 8, "%" PRId8, 2);
警告:
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,
我知道这可以通过将buf作为* char来修复,但是
int8_t是typedef as unsigned char
使用预处理器输出检查,即gcc main.c | grep int8_t
那么为什么编译器无法理解呢?
使用buf as uint8_t我也会得到同样的警告。
编辑:
int8_t是typedef作为signed char(错误地我在原帖中写为unsigned)
答案 0 :(得分:4)
sprintf
系列调用需要一个char *
缓冲区来编写数据。
您目前将其作为int8_t *
(签名 8位值),并且它抱怨该类型的签名几乎肯定意味着裸char
在您的系统上是未签名的(标准是开放的,char
是否是有符号或无符号类型)或gcc
是否足够聪明,可以认为这可能是其他编译器的可移植性问题。
请注意,这是警告所以它可能仍然有用。但是,我喜欢清理这样的代码,以便让我的生活更轻松。
当然,修复是使用正确的类型(通过将类型更改为char buf[8]
或通过在snprintf
调用中显式转换它,从而告诉编译器您知道什么是'重做)。