【发布时间】:2012-05-20 23:39:05
【问题描述】:
好的,我在 Windows 7 上使用 MinGW (GCC 4.6.2) 编译 C 文件时遇到了一个奇怪的问题。有问题的文件包含以下 C 代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%2hhX\n", 250);
char c[80];
snprintf(c, sizeof(c), "%2hhX", 250);
printf("%s\n", c);
return 0;
}
编译结果如下:
$ gcc.exe -std=c99 -pedantic -Wall test.c
test.c: In function 'main':
test.c:6:2: warning: unknown conversion type character 'h' in format [-Wformat]
test.c:6:2: warning: too many arguments for format [-Wformat-extra-args]
现在,对我来说奇怪的是它抱怨第 6 行的 snprintf 调用,而不是第 4 行的 printf 调用。我错过了什么还是警告不正确?此外,格式字符串"%2hhX" 是否有更好的等价物? (我正在尝试将 char 变量打印为十六进制值。)
【问题讨论】:
-
有趣的是,它适用于 GCC 4.3.4:ideone.com/LAPP9。我也尝试过 4.1.2,它也很好。
-
使用 MinGW GCC 4.6.1 我在
printf()和snprintf()上都收到警告 - 你使用的是什么 MinGW 发行版?我目前正在使用 TDM 发行版。 -
@MichaelBurr:呃,我什至没有意识到有几个 MinGW 发行版。我想我正在使用“标准”版本(mingw.org,与sourceforge.net/projects/mingw/files/Installer/mingw-get-inst 一起安装)。不过,这会有所不同吗?
-
另外,我现在更加困惑,因为我们在 4 个版本的 GCC 上有 3 种不同的行为。格式字符串 is 有效,不是吗?
-
@Socob:我通常使用 TDM 的 MinGW (tdm-gcc.tdragon.net) 和/或 nuwen 的 (nuwen.net/mingw.html)。我发现它们比官方的 MinGW 更容易安装(nuwen 的字面意思是解压缩档案),它们打包了其他有用的库(例如,TDM 中的 pthreads-win32 和 nuwen 中的 Boost)并且 TDM 有一个选项64 位目标编译器。