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 工具命令提示符发出的。
如果我遗漏了任何测试用例,请发表评论让我知道。
测试
C 测试
测试 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
C++ 测试
测试 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 得到这个吗?
我重新运行了上面的测试,看看是否可以仅使用 C4715 获得相同的行为,这是我的结果。我用来测试这个的命令是
cl /nologo /W0 /we4715 <path to file>
#pragma warning
来防止这种情况发生)这意味着 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/