You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中sizeof返回long unsigned int而非int的编译警告问题

关于sizeof返回类型与printf格式不匹配的警告问题解析

先看你给出的代码:

#include <stdio.h>

enum weekDays {
  Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
};

int main()
{
  const enum weekDays today = Wednesday;

  printf("Size of today is %d", sizeof(today));

  return 0;
}

编译时出现的警告核心是:sizeof的返回值类型是long unsigned int,但你用了对应int类型的%d格式符,类型不匹配导致编译器告警。

问题本质

sizeof操作符的返回类型是标准定义的size_t,这是一个无符号整数类型,它的具体底层类型取决于你的编译环境:

  • 在32位系统/编译模式下,size_t通常等价于unsigned int
  • 在64位系统/编译模式下,size_t通常等价于long unsigned int

你遇到的情况是当前环境下size_t是long unsigned int,而%d是用来输出有符号int的,类型不匹配就触发了-Wformat=警告(这是gcc默认开启的警告之一)。

为什么教程里的相同代码能正常运行?

原因主要有两个:

  • 教程可能用的是32位编译环境,此时size_t和unsigned int长度相同,虽然类型不匹配,但数值能正确输出,加上可能没开启高等级警告,所以没出现告警。
  • 很多入门教程更关注功能实现,会忽略这类严谨性问题,没强调类型匹配的重要性。

正确的解决方式

推荐用以下两种方法解决:

  1. 使用C99标准的%zu格式符(最推荐,跨平台通用)
    这是专门为size_t类型设计的格式符,不管size_t底层是什么类型都能正确输出:
    printf("Size of today is %zu", sizeof(today));
    
  2. 强制类型转换(不推荐,兼容性差)
    如果你的编译器不支持C99(非常少见),可以把结果转成对应类型后输出:
    printf("Size of today is %lu", (unsigned long)sizeof(today));
    

另外建议编译时加上-Wall参数,它会帮你开启更多有用的警告,提前发现这类潜在问题,写出更健壮的代码:

gcc <filename> -o <output_name> -Wall

内容的提问来源于stack exchange,提问作者goplay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:33:00