You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MinGW GCC编译含unsigned long long类型的printf代码时出现格式警告求助

MinGW GCC编译含unsigned long long类型的printf代码时出现格式警告求助

嘿,这可不是编译器bug哦,是MinGW GCC的一个常见特性导致的问题,我来给你捋清楚咋解决~

先看看你贴的代码:

#include <stdio.h>

int main()
{
    unsigned long long int the_num = 600851475143;
    printf("%llu", the_num);
    return 0;
}

还有你遇到的警告信息:

3.c: In function 'main':
3.c:10:12: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu", the_num);
^
3.c:10:9: warning: too many arguments for format [-Wformat-extra-args]
printf("%llu", the_num);
^~~~~~

你的环境信息:

  • GCC版本:gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
  • 编译命令:gcc -Wall -Wextra -pedantic 3.c

问题根源

MinGW默认使用Windows系统自带的C运行时库msvcrt.dll,而这个库的printf函数并不遵循POSIX标准的格式符——它用%I64u来表示无符号64位整数,而不是POSIX里的%llu。当编译器看到%llu时,会认为这是无效的格式符,进而抛出警告,甚至因为解析错误认为你传了多余的参数。

解决方法,给你三种选择:

1. 直接改用Windows兼容的格式符

%llu换成%I64u,就能适配MinGW的默认运行时了:

printf("%I64u", the_num);

2. 用跨平台的宏保证可移植性

如果你希望代码能在Linux、macOS等其他平台也正常编译运行,推荐使用<inttypes.h>头文件里的标准宏PRIu64,它会根据不同平台自动展开成对应的格式符:
首先添加头文件引用:

#include <inttypes.h>

然后修改printf语句:

printf("%" PRIu64, the_num);

在MinGW下这个宏会变成"I64u",在POSIX平台则变成"llu",完美兼顾跨平台需求。

3. 强制使用MinGW的ANSI标准stdio实现

给编译命令加上-D__USE_MINGW_ANSI_STDIO选项,让编译器使用MinGW自己实现的符合ANSI标准的stdio库,这样%llu就能正常被识别了:

gcc -Wall -Wextra -pedantic -D__USE_MINGW_ANSI_STDIO 3.c

额外解释下第二个警告

之所以会出现“too many arguments”的警告,是因为编译器解析%llu时,把第一个l当成了无效的格式字符,剩下的lu被当作普通文本输出,这样格式字符串里就没有需要参数的占位符了,但你又传了the_num这个参数,所以就触发了“参数过多”的警告。

备注:内容来源于stack exchange,提问作者Rodion Iskhakov

火山引擎 最新活动