当前位置: 首页 > 知识库问答 >
问题:

大小\u t格式警告,gcc标准=gnu90

苍恩
2023-03-14

我目前正在从事一个C语言的软件项目,该项目必须在各种平台上运行。我试图尽可能接近C90标准,但需要一些常用的支持扩展,如stdint。h和一个无符号长类型。我故意不想“倒退”到C99标准,因为我使用的一些编译器不支持所有C99特性,如混合声明和代码等。

因此,我目前使用gcc在我的(64位Ubuntu)开发机器上编译所有代码,使用-Wall-Wextra-pedantic-std=gnu90(不是C90,因为我使用了如上所述的unsigned long-long等),以处理所有不符合格式的代码部分。到目前为止,我可以修改我的代码以消除除一个警告之外的所有警告:我找不到一个适合大小的(printf)格式,它不会从gcc生成警告。考虑下面的示例代码,它说明了我尝试过的大部分内容:

#include <stdint.h>
#include <stdio.h>

int main()
{
  printf("%zu", sizeof(int)); /* C99 format specifier for size_t */
  printf("%u", sizeof(int)); /* Treat size_t as unsigned int */
  printf("%lu", sizeof(int)); /* Treat size_t as unsigned long int (only works when size_t is "typedef"ed to unsigned long int) */
  return 0;
}

当使用-Wall-Wextra-pedantic-std=gnu90编译时,我会收到前两行的警告:

测验c:6:3:警告:ISO C90不支持“z”gnu_printf长度修饰符[-Wformat=]测试。c:7:3:警告:格式“%u”要求参数类型为“unsigned int”,但参数2的类型为“long unsigned int”[-Wformat=]

虽然我没有得到第三行的警告,但这只是我开发系统上的情况。在其他系统上,特别是在那些size_t是一些“自定义”类型或不是“typedef”的系统上,仍然会有警告。

我很清楚C90中没有size_t的格式说明符,但是C99中有一个。然而,我以为设置-std=gnu90会给我'z'格式说明符,但是这个假设被证明是不正确的。

由于无法消除警告,我尝试使用一些预处理器定义来定义格式说明符,如下所示:

#include <inttypes.h>
#include <stdio.h>

#ifdef __GNUC__
  #define GLUE(x, y, z) x##y##z
  #define GLUE_FORMAT(prefix, size) GLUE(PRI, prefix, size)
  #define UINT_FORMAT(size) GLUE_FORMAT(u, size)
  #define SIZE_T_FORMAT UINT_FORMAT(__SIZEOF_SIZE_T__)
#else /* C99 fall-back */
  #define SIZE_T_FORMAT "zu"
#endif

int main()
{
  printf("%" SIZE_T_FORMAT, sizeof(int));
  return 0;
}

我认为这应该给我一个合适的格式说明符,唯一的限制是size\u t是无符号的(到目前为止,在我的所有目标平台上都是如此)。但是,这也不起作用:

测验c:15:3:警告:格式“%u”要求参数类型为“unsigned int”,但参数2的类型为“long unsigned int”[-Wformat=]

考虑到这些限制,有没有办法克服这个警告(或者找到一个更优雅的解决方案,而不必求助于-std=c99)?

共有1个答案

严朝明
2023-03-14

你会考虑演员阵容吗?强制转换通常是问题的标志,但在某些情况下,只编写可能是最简单的

printf("%u", (unsigned) sizeof(int));

您甚至可以将强制转换组合到宏中

#define usizeof(a) ((unsigned)sizeof(a))
printf("%u", usizeof(int));

这将使它很容易使用。

 类似资料:
  • 我在调试中不断看到这个错误。登录cassandra, 在这个里面 因此,根据Cassandra中的这个标签,https://github . com/krasserm/akka-persistence-Cassandra/issues/33,我看到这是由于输入有效负载大小的增加,所以我将cassandra.yml中的< code > commit log _ segment _ size _ in

  • 我正在使用Java测量线束(JMH)对一些例程进行基准测试。我对获取每次运行的最大堆大小感兴趣。JMH的GC Profiler为我提供了诸如分配率和流失率之类的信息,但我正在寻找在测试运行期间堆获得的最大值。这能做到吗?

  • 问题内容: 是否存在用于构造来自API的JSON响应的标准或最佳实践?显然,每个应用程序的数据都是不同的,因此您不必担心很多,而是“响应样板”。我的意思的例子: 成功的请求: 请求失败: 问题答案: 是的,已经出现了一些标准(尽管对标准的定义有一些自由): JSON API -JSON API还涵盖创建和更新资源,而不仅仅是响应。 JSend-简单,可能已经在做。 OData JSON协议 -非常

  • 我想启用 - 从字面上看 - GCC的所有警告。(你会认为这很容易... > < li> 您可能会认为-Wall可能会成功,但事实并非如此!你仍然需要-Wextra。 你会认为可能会成功,但没有!并非此处列出的所有警告(例如-Wshadow)都由此启用。我仍然不知道这个列表是否全面。 我如何告诉GCC启用(没有if,and,or but!)它拥有的所有警告?

  • 引用脚本的内容: /* 将整数的文件大小(B)转换成标准格式之一 注意:最大显示大小是MB By:Ansifa */ SetCompressor /SOLID lzma XPStyle on Var InSize Var OutSize OutFile "将nsis中整数的文件大小(KB)转换成标准格式(KB,MB).EXE" Name "将nsis整数的文件大小(KB)转换成标准格式(KB

  • 我正在尝试构建一个小的C#Windows窗体,图形程序,我需要保存/加载sprite表单。我已经搜索了,但是找不到sprite表的标准文件格式,但是我找到了.sprite扩展名。 所以我的问题是: .sprite文件是否有标准格式(例如,头15字节,包含长度等) 对于sprite工作表,是否应该使用不同的文件格式?