gpt4 book ai didi

c++ - 从 Visual Studio 2013 迁移到 Visual Studio 2015 后,调用 printf 样式的函数会导致警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:19 24 4
gpt4 key购买 nike

我有一个调用 fprintf 的程序。在 Visual Studio 2013 中,编译和执行的所有内容都没有错误和警告。现在该项目已迁移到 Visual Studio 2015(没有任何更改),我在大多数 fprintf 调用中收到以下警告:

C4474: too many arguments passed for format string

大多数警告都指向以下代码行:

fprintf (stderr,"Missing header file name. Formant is :\n", pArg);

我该如何解决这个问题?我是否需要重写我的代码,或者我的项目设置是否有问题导致这些警告?


我看到了,在 this MSDN 文章对这些函数进行了更改:

The definitions of all of the printf and scanf functions have been moved inline into stdio.h, conio.h, and other CRT headers.

这与我的问题有关吗?这只是 VS 2015 中的无害更改,还是这里也存在潜在的崩溃诱导陷阱?

最佳答案

引入 Visual C++ 2015 "format specifiers checking" .编译器可以在编译时检测到一些问题并生成警告。在 2015 年之前,格式字符串和参数之间的不匹配不会在编译时或运行时生成任何诊断信息(除非问题严重到足以导致程序崩溃)。

您显示的代码有一个额外的参数 pArg 不会被 fprintf() 使用,因为格式字符串中没有占位符。

您将必须检查每一个警告并修复它们。 不要忽略它们。它们可能表示无害的问题或严重的错误。请注意,某些警告仅在使用 /W4 时可见。无论如何,您应该始终使用 /Wall

举几个例子:

void f()
{
printf("hello, world", 42); // line 8: no %d in format string
printf("missing %d"); // line 9: missing argument for %d
printf("wrong type %f", 3); // line 10: wrong argument type
}

这些是使用 cl/Wall 生成的警告:

a.cpp(8): warning C4474: 'printf' : too many arguments passed for format string
a.cpp(8): note: placeholders and their parameters expect 0 variadic arguments,
but 1 were provided
a.cpp(9): warning C4473: 'printf' : not enough arguments passed for format string
a.cpp(9): note: placeholders and their parameters expect 1 variadic arguments,
but 0 were provided
a.cpp(9): note: the missing variadic argument 1 is required by format string '%d'
a.cpp(10): warning C4477: 'printf' : format string '%f' requires an argument of
type 'double', but variadic argument 1 has type 'int'

注意 gcc 有一个等效的 -wformat since 3.0 .

关于c++ - 从 Visual Studio 2013 迁移到 Visual Studio 2015 后,调用 printf 样式的函数会导致警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38850542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com