Visual Studio 是否有与 GCC 的 -Wreturn-type 等效的警告(或多个警告)?
更具体地说,我正在寻找一个 Visual Studio 警告(或多个警告),它将针对返回类型不是
void
where 的函数中的实例发出警告
return
语句,没有返回值;或我不关心
-Wreturn-type
的其他部分,只要使用默认为 int
的返回类型定义函数就会发出警告。
作为参考,GCC 警告选项可以在这里找到。
正如评论中指出的,这可以通过 C4033、C4716、C4715 来完成。
用户n。 1.8e9-where's-my-share m. 也很好地说明了如何查找 MSVC 一般警告:
如果你想知道是否存在你想要的警告,只需启用所有[使用
]并针对一小段代码进行测试。如果有警告,恭喜你,你找到了。如果没有,那么运气不好,没有。/Wall
我使用
.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 Tools 命令提示符发出的。
如果我遗漏了任何测试用例,请发表评论让我知道。
测试 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
没有值的函数
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
没有值的函数
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>
测试 | C | C++ |
---|---|---|
测试1 | 没有警告或错误 | 触发 C4716 作为错误,即使未打开(这是有道理的,因为此警告的 文档 表示它会自动升级为错误,除非使用 来防止这种情况) |
测试2 | 没有警告或错误 | 触发器C2561(编译器错误) |
测试3 | 触发器 C4715 | 触发器 C4715 |
这意味着 C4715 对于 C++ 来说足够了,但对于 C 来说还不够。
如果您调用永不返回的函数,C4715 可能会发出警告。例如,如果您调用以
while (true) {}
或 throw "error message";
结尾的函数。为了避免这种情况,请使用 __declspec(noreturn)
声明永不返回的函数,或者如果您使用的是 C++11 或更高版本,则可以在函数声明中使用更可移植的 [[noreturn]]
。 (如果您调用像 exit()
这样的标准库函数,编译器不会发出警告,因为它知道该函数永远不会返回。)
有关一些有趣的相关讨论,请参阅为什么在不返回值的情况下从非 void 函数末尾流出不会产生编译器错误?。