printf("%f",x) ok, printf("%F",x) 错误格式参数太多

Fed*_*tti 6 c printf codeblocks format-specifiers

当我在 CodeBlocks 中使用说明符 F 时,为什么编译器给我错误“格式参数太多”?

#include <stdio.h>

int main()
{
    float x = 3.14159;
    printf("%f\n", x);
    printf("%F\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

#include <stdio.h>

int main()
{
    float x = 3.14159;
    printf("%f\n", x);
    printf("%F\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

ana*_*ciu 4

奇怪的是,看起来某些版本的 GCC 无法识别%F。我的gcc version 9.2.0 (tdm64-1)Windows 具有 C11 标准,无法识别它,尽管它只发出警告消息而不是错误。

$ gcc main2.c -Wextra -Wall -pedantic -std=c11
main2.c: In function 'main':
main2.c:7:14: warning: unknown conversion type character 'F' in format [-Wformat=]
    7 |     printf("%F\n", x);
      |              ^
main2.c:7:12: warning: too many arguments for format [-Wformat-extra-args]
    7 |     printf("%F\n", x);
      |            ^~~~~~
Run Code Online (Sandbox Code Playgroud)

执行时不会打印该值。

我猜您可能在 Windows 系统中使用某些 mingW 安装,并且您的编译器必须将警告视为错误,这不是一个坏主意。

正如@HolyBlackCat 建议的那样,添加-D__USE_MINGW_ANSI_STDIO标志解决了这个问题。

该线程包含有关如何执行此操作的说明。

@RobertS 支持 Monica Cellio 答案有一个链接,其中包含有关如何将其添加到 CodeBlocks 的说明。

或者,为了快速修复代码,您可以使用%G, 或%E科学记数法。

  • 来自 MSYS2 的 GCC 10.1,没有警告。添加 `-D__USE_MINGW_ANSI_STDIO` 对您有什么改变吗? (2认同)