当我在CodeBlocks中使用说明符F时,编译器为什么给我错误“太多的格式参数”?
#include <stdio.h>
int main()
{
float x = 3.14159;
printf("%f\n", x);
printf("%F\n", x);
return 0;
}
错误:
error: unknown conversion type character 'F' in format [-Werror=format=]
error: too many arguments for format [-Werror=format-extra-args]
发布于 2020-06-07 01:58:15
看起来有些版本的GCC不认识%F
,奇怪的是。我的gcc version 9.2.0 (tdm64-1)
for 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);
| ^~~~~~
执行时不打印值。
我猜您可能在Windows中使用了一些mingW安装,而您的编译器必须将警告作为错误来处理,这并不是一个坏主意。
作为@HolyBlackCat建议,添加-D__USE_MINGW_ANSI_STDIO
标志解决了这个问题。
这个帖子有关于如何做到这一点的说明。
@RobertS支持莫妮卡·塞利奥的回答有一个关于如何将其添加到CodeBlocks的说明的链接。
或者,对于代码的快速修复,可以使用%G
或%E
作为科学表示法。
发布于 2020-06-07 01:54:27
F
格式说明符最初是在C99中引入的。您的编译器似乎符合C89/C90,或者启用了std=c90
/std=c89
编译器选项。
如果配置的编译器是gcc,则可以使用gcc --version
命令检测版本。
否则,应检查编译器所使用的标准的set编译器选项。看看这里:
虽然对于Ubuntu (我不知道您使用的是什么操作系统CodeBlocks),但这的回答为您提供了CodeBlocks编译器选项设置的直观概述。
发布于 2020-06-08 12:06:41
编译器给出了错误“printf的太多参数”,因为它不承认%F
是格式说明符.因此,添加到printf()
中的参数是额外的,不应该存在。
下面C89中的标准格式说明符,指定浮点格式为e
、E
、f
、g
和G
(不包括F
,原因在本答案的最后编辑中说明)
请记住,编译器根本不应该读取printf()
的格式字符串来将参数与格式说明符匹配,所以在那里发生的事情只应该处理和printf(3)
规范,这确实是printf(3)
的一个问题,而不是编译器。可能,如果您尝试生成的程序,它应该可以工作。
编辑
我试过clang (对不起,但我这里没有gcc ),我也发现了一些可能的原因(也不是一个错误)。这里的printf(3)
实现根本不使用科学符号(这是我没有用标准检查过的),因此它永远不会生成字母字符,也不会涉及小写或大写字母。所以对于程序来说
#include <stdio.h>
int main()
{
printf("%5.3G\n", 3.141592654E160);
}
它打印:
$ ./a.out
3.14E+160
$ _
而为
#include <stdio.h>
int main()
{
printf("%5.3F\n", 3.141592654E160);
}
印出来
$ a.out
31415926539999999255132844331312943389972993386142531366742209094398699375217155068328829400434148008839629239544769533043070670437328460352417427610347451187200.000
$ _
由于只发出数字和小数点,在格式说明符的大小写上没有大写或小写解释,因此这两种形式都是等效的(但其中一种是非标准的)。
解决方案只是切换到小写f
。
正如@chux-ReinstateMonica莫妮卡在评论之一C89第133页(pdf的143页)中所建议的,标准不包括F
格式说明符,只有e
、E
、f
、g
和G
。考虑到f
从未改变为指数表示法,这应该是正常的。
https://stackoverflow.com/questions/62243319
复制