注意:预期'char * __restrict__'但参数的类型为'int8_t *'

时间:2016-06-01 06:19:25

标签: c gcc

代码:

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)

1 个答案:

答案 0 :(得分:4)

sprintf系列调用需要一个char *缓冲区来编写数据。

您目前将其作为int8_t *签名 8位值),并且它抱怨该类型的签名几乎肯定意味着裸char在您的系统上是未签名的(标准是开放的,char是否是有符号或无符号类型)或gcc是否足够聪明,可以认为这可能是其他编译器的可移植性问题。

请注意,这是警告所以它可能仍然有用。但是,我喜欢清理这样的代码,以便让我的生活更轻松。

当然,修复是使用正确的类型(通过将类型更改为char buf[8]或通过在snprintf调用中显式转换它,从而告诉编译器您知道什么是'重做)。