如何在Visual Studio 2008中处理警告C4100

Jim*_*mie 13 c++ visual-studio

出于某种原因,我的Visual Studio 2008开始显示代码警告:"int main(int argc,char**argv)",这真的很烦人.

详细的警告输出是(你可以忽略行号):
1>.\ main.cpp(86):警告C4100:'argv':未参考形式参数
1>.\ main.cpp(86):警告C4100:' argc':未参考的形式参数

我想知道Visual Studio 2008中是否有意外更改的设置.或者我该如何处理这个警告?

Jam*_*lis 21

如果参数未被引用,您可以将它们保留为未命名:

int main(int, char**)
{
}
Run Code Online (Sandbox Code Playgroud)

代替

int main(int argc, char** argv)
{
}
Run Code Online (Sandbox Code Playgroud)

如果您真的只想抑制警告,可以使用/wd4100编译器的命令行选项或#pragma warning(disable: 4100)在代码中使用.

这是4级警告; 如果您以较低的警告级别进行编译,则不会收到此警告.警告级别在项目属性中设置(右键单击项目,选择"属性";在"配置属性" - >"C++" - >"常规"中,设置"警告级别").

  • 请注意,在C++中,在函数定义中使用未命名的参数是正常的,但如果您将其编译为C则是一个错误(有时在尝试编写以任一方式编译的代码时会有一点小小的烦恼). (3认同)

Mic*_*urr 5

警告 C4100 在警告级别 4 发出,这不是默认值,因此在某些时候有人可能会为您的项目更改它。

您可以更改警告级别,或者更直接地解决警告。

正如James McNellis 所说,您可以通过从参数列表中删除参数名称来消除 C++ 中的警告。但是,如果将代码编译为 C 代码,在这种情况下您将收到错误消息。

Windows 标头定义了UNREFERENCED_PARAMETER()帮助处理此警告的宏。你可以用

UNREFERENCED_PARAMETER( argc);
UNREFERENCED_PARAMETER( argv);
Run Code Online (Sandbox Code Playgroud)

使警告静音。如果您不想包含 Windows 标题,则宏只是扩展为在无操作表达式中使用参数名称:

#define UNREFERENCED_PARAMETER(P)          \
    /*lint -save -e527 -e530 */ \
    { \
        (P) = (P); \
    } \
    /*lint -restore */
Run Code Online (Sandbox Code Playgroud)

  • 我不知道`UNREFERENCED_PARAMETER`;很高兴知道。在 Windows 标头中,有两个版本。默认情况下启用的只是扩展为“(P)”。您引用的另一个扩展为`(P) = (P);`,如果定义了`lint`,则使用;对于 const 限定或不可分配类型的参数,此方法将失败。 (2认同)

CB *_*ley 5

如果您没有使用命令行参数,那么main的其他标准签名是:

int main();
Run Code Online (Sandbox Code Playgroud)

  • 是的,在C; C++没有区别,因为它们是等价的.问题被标记为C++,所以我选择了通常在C++中使用的没有参数的形式. (3认同)