【问题标题】:note: expected ‘char * __restrict__’ but argument is of type ‘int8_t *’注意:预期为“char * __restrict__”,但参数类型为“int8_t *”
【发布时间】:2016-06-01 06:19:24
【问题描述】:

代码:

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 为 unsigned char

使用预处理器输出检查,即gcc main.c | grep int8_t

那么为什么编译器无法理解呢?

使用 buf as uint8_t 我也会收到相同的警告。

编辑:

int8_t 是 typedef 为 signed char (我在原帖中误写为 unsigned)

【问题讨论】:

  • 什么是PRId8。对snprintf 的调用不应该是bytes_written = snprintf(buf, 8, "%PRId8", 2); 吗?
  • @Nishant 不,PRId8 是 CPP 宏。
  • @a3f Aah :) 不,CPP 是 C++ 的缩写。
  • @Nishant 不,那部分是正确的。看看this SO post
  • @alk 所以G++预处理器叫CPPPP?

标签: c gcc


【解决方案1】:

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

您目前将它作为 int8_t *(一个 有符号 8 位值),并且它抱怨类型的符号性这一事实几乎可以肯定意味着裸 char 在您的系统(标准对char 是有符号还是无符号类型保持开放)或者gcc 足够聪明,可以意识到这可能是其他编译器的可移植性问题。

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

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

【讨论】:

  • char 是与 signed charunsigned char 不同的类型。
  • @paxdiablo 它对 buf 给出了与 uint8_t 相同的警告。我正在使用 gcc 编译代码,默认情况下将 char 视为已签名的 char
猜你喜欢
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2020-07-31
  • 2011-09-22
相关资源
最近更新 更多