我在Visual Studio 2019,Windows 10中构建C++控制台应用程序时注意到一条烦人的消息。我有一个模板函数,可以生成一条消息:
message : see reference to function template instantiation 'int run_loop<wchar_t>(int,const char_type *[])' being compiled
with
[
char_type=wchar_t
]
类似的代码在macOS和Ubuntu上没有消息的情况下编译得很好,但现在我将其移植到Windwos并看到这个。这不是错误或警告,只是一个信息消息。我开始注释掉功能内部的代码块,发现当我注释掉std::exception
捕获消息时,消息消失了。此消息是什么意思,我应该如何处理?保持原样还是应该以其他方式重新签名我的代码?下面是生成上述消息的简化代码片段:
#include <exception>
template<class char_type>
int run_loop(int argc, const char_type* argv[])
{
try
{
}
catch (const std::exception& ex)
{
}
return 0;
}
int wmain(int argc, const wchar_t* argv[])
{
return run_loop(argc, argv);
}
我的环境:
操作系统:Windows 10 专业版 x64 版本 1909 操作系统内部版本 18363.836
IDE:Visual Studio 2019 版本 16.6.0
C++ 中的 Win32 控制台应用程序模板,具有默认设置:
视窗软件开发工具包版本:10.0
平台工具集:Visual Studio 2019 (v142(
这个编译器消息并不代表它自己,它伴随着另一个消息。给定您的代码,完整的输出是
警告 C4100:"argv":未引用的形式参数
消息:请参阅对函数模板实例化"int run_loop(int,const char_type *[]("的引用,该实例化正在编译
时使用
[
char_type=wchar_t
]
因此,主要消息是警告argv
是未引用的形式参数。编译器会为您提供附加提示,其中包含模板如何实例化的消息。如果模板有多个实例化,并且警告仅在某些实例化时发生,则这可能很有用。
顺便说一句,修复该警告后,您仍然会收到相同的消息,因为argc
和ex
也未使用。删除所有三个名称或使用它们后,您将不再收到警告和消息。