- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Visual Studio 是否有相当于 GCC 的 -Wreturn-type 的警告(或警告)? ?
更具体地说,我正在寻找一个 Visual Studio 警告(或多个警告),它会针对返回类型不是 void
的函数中的实例发出警告,其中
return
语句;或我不关心 -Wreturn-type
的另一部分,它会在定义函数的返回类型默认为 int
时发出警告。
作为引用,可以找到 GCC 警告选项 here .
最佳答案
正如评论中所指出的,这可以通过 C4033 来完成, C4716 , C4715 .
用户 n. 1.8e9-where's-my-share m.关于如何找到 MSVC 也提出了一个很好的观点一般警告:
If you want to find out whether a warning that you want exists, just enable all [using
/Wall
] and test against a small piece of code. If there is a warning, congrats, you found it. If not, tough luck, there isn't any.
我用 .c
测试了两者和 .cpp
文件扩展名,以防万一编译器根据它正在编译的语言表现不同(果然,测试 2 的行为不同)。
我的所有测试都没有提示 main()
,因为 main()
是特殊的,因为它是 C 和 C++ 中唯一默认返回 0
的函数如果没有明确 return
提供。
下面的所有测试都是使用 Visual Studio 2015 的编译器(即 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe
)完成的,命令是从 VS2015 x86 native 工具命令提示符发出的。
如果我遗漏了任何测试用例,请发表评论让我知道。
测试 1 - int
的空函数返回类型
test_warnings.c:
int main() {}
int foo() {}
编译结果:
>cl /nologo /W0 /we4033 /we4716 /we4715 C:\Users\Administrator\src\test-code\test_warnings.c
test_warnings.c
c:\users\administrator\src\test-code\test_warnings.c(3) : error C4716: 'foo': must return a value
测试 2 - int
的功能返回类型为 return
没有值(value)
test_warnings.c:
int main() {}
int foo() {
return;
}
编译结果:
>cl /nologo /W0 /we4033 /we4716 /we4715 C:\Users\Administrator\src\test-code\test_warnings.c
test_warnings.c
C:\Users\Administrator\src\test-code\test_warnings.c(4): error C4033: 'foo' must return a value
测试 3 - int
的功能执行可能会“脱离”函数末尾的返回类型
此测试表明这些警告是不够的,因为此代码没有发出警告或错误。
test_warnings.c:
#include <stdlib.h>
#include <time.h>
int main() {}
int foo() {
int rand_num;
srand(time(0));
rand_num = rand();
if (rand_num > 1) {
return 0;
}
}
编译结果:
>cl /nologo /W0 /we4033 /we4716 /we4715 C:\Users\Administrator\src\test-code\test_warnings.c
test_warnings.c
c:\users\administrator\src\test-code\test_warnings.c(14) : error C4715: 'foo': not all control paths return a value
测试 1 - int
的空函数返回类型
test_warnings.cpp:
int main() {}
int foo() {}
编译结果:
>cl /nologo /W0 /we4033 /we4716 /we4715 C:\Users\Administrator\src\test-code\test_warnings.cpp
test_warnings.cpp
c:\users\administrator\src\test-code\test_warnings.cpp(3) : error C4716: 'foo': must return a value
测试 2 - int
的功能返回类型为 return
没有值(value)
test_warnings.cpp:
int main() {}
int foo() {
return;
}
编译结果:
>cl /nologo /W0 /we4033 /we4716 /we4715 C:\Users\Administrator\src\test-code\test_warnings.cpp
test_warnings.cpp
C:\Users\Administrator\src\test-code\test_warnings.cpp(4): error C2561: 'foo': function must return a value
C:\Users\Administrator\src\test-code\test_warnings.cpp(3): note: see declaration of 'foo'
测试 3 - int
的功能执行可能会“脱离”函数末尾的返回类型
test_warnings.cpp:
#include <stdlib.h>
#include <time.h>
int main() {}
int foo() {
int rand_num;
srand(time(0));
rand_num = rand();
if (rand_num > 1) {
return 0;
}
}
编译结果:
>cl /nologo /W0 /we4033 /we4716 /we4715 C:\Users\Administrator\src\test-code\test_warnings.cpp
test_warnings.cpp
c:\users\administrator\src\test-code\test_warnings.cpp(14) : error C4715: 'foo': not all control paths return a value
我重新运行了上面的测试,看看是否可以仅使用 C4715 获得相同的行为,这是我的结果。我用来测试这个的命令是
cl /nologo /W0 /we4715 <path to file>
#pragma warning
来防止这种情况发生)测试2没有警告或错误触发器
C2561 (编译错误)测试3触发 C4715触发 C4715
这意味着 C4715 足以用于 C++,但不足以用于 C。
如果您调用永不返回的函数,C4715 可能会发出警告。例如,如果您调用以 while (true) {}
结尾的函数或 throw "error message";
.为避免这种情况,请使用 __declspec(noreturn)
声明永不返回的函数。 ,或者如果您使用的是 C++11 或更新版本,则可以使用更便携的 [[noreturn]]
在函数声明中。 (如果您正在调用标准库函数,如 exit()
,编译器将不会发出警告,因为它知道该函数永远不会返回。)
有关一些有趣的相关讨论,请参阅 Why does flowing off the end of a non-void function without returning a value not produce a compiler error? .
关于c++ - 与 GCC 的 -Wreturn-type 等效的 Visual Studio 警告是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72033411/
我经常使用 SSMS 查询数据和构建数据集,我的 IT 部门负责数据库管理。 最近我发现了 Azure Data Studio,我喜欢: 智能感知 源代码控制(例如使用 Git) 来自社区的扩展 SQ
我想根据我使用的 visual studio 版本编译不同的东西,比如 #if VISUAL_STUDIO_VERSION > 2015 eventH?.Invoke(this, EventArgs.
我们的开发团队计划从 visual studio 2005 升级到 visual studio 2010 -- 跳过 visual studio 2008。 大部分项目是VB ASP.NET项目,使用
我的Visual Studio 2015无法构建2010平台工具集。它说: The build tools for Visual Studio 2010 (v100) cannot be found.
我目前正在使用 Visual Studio 2015 来编程 ASP.NET Core 应用程序。我对安装 Visual Studio 2017 有以下疑问: 什么被认为是最佳实践和/或最干净的方法?
尝试从扩展和更新获取 Visual Studio 扩展时,出现以下错误:- 向 visualstudiogallery.msdn.microsoft.com/Services/VStudio/Exte
这个问题在这里已经有了答案: Can Visual Studio Code and VS 2012 be installed on same computer? (1 个回答) 关闭去年。 在安装了
作为标准安装的一部分,Visual Studio Code 带有一个名为“Monokai Dimmed”的颜色主题。 有没有办法将它移植到 Visual Studio 2015?我检查了社区主题( h
我想开始编程 CUDA。 我已经安装了 Visual Studio 2010 Express。 我还安装了 nVidia nSight Visual Studio。 而且我具备所有常见的先决条件(Ne
Visual Studio Community Edition是否可以使用Visual Studio Online帐户上的存储库? 我一直为包含在Online帐户中的Visual Studio Onl
我有一个我一直在开发的应用程序,但在 android studio 上遇到了问题。当我点击“build->run”然后选择我的设备时,应用程序永远不会在我的手机上运行(并且自动出现的android-s
我正在使用Visual Studio2010。我面临的一个问题是,当我创建一个新的Web项目时,Visual Studio将创建该项目,并且不会在解决方案资源管理器中显示其解决方案。 另一件事是,我想
我通读了这里的许多帖子,却找不到一个有效的明确答案。因此,在花了一些时间使它生效之后,我认为应该发布它。 问题:发布配置文件将建立在服务器上,但不会发布。 解: 确保已安装Microsoft Wind
我正在尝试使用Visual Studio 2012构建针对.NET 3.5的C++ CLI应用程序。 通过安装Visual Studio 2008,并指定v90平台工具集,我已经在一台机器上进行了这项
我在 Microsoft Visual Studios 2013 中有一个项目,我想在 Microsoft Visual Studios 2010 中打开它。有什么简单的方法吗?还是我必须在2010年
我想知道,如果我发送一个解决方案文件夹(它是用 visual studio C# 编写的),您可以在 visual studio for mac 中打开解决方案吗? 在visual studio 20
有没有办法在 Visual Studio Code 和 Visual Studio 中设置相同的快捷方式(而不必每次都手动更改它们)? 例如,我在 Visual Studio Code 中经常使用 A
我刚开始了解 Visual Studio Code。我想知道,我可以将 Visual Studio 替换为所有 .NET 开发相关的工作吗? 我可以节省 Visual Studio 许可的成本吗? V
我安装了具有有效许可证(Visual Studio 订阅)的 Visual Studio 2019 企业版(VS 2019 16.1.4),它运行良好。 突然之间,当我尝试打开项目或项目中的任何文件时
我一直在使用 Compass 编译 Windows 环境中的 sass 文件,无论是在命令行上还是使用 Compass-app 来查看目录。 我刚刚开始使用 Visual Studio(专业版 201
我是一名优秀的程序员,十分优秀!