相当于 GCC 的 -Wreturn-type 的 Visual Studio 警告是什么?

问题描述 投票:0回答:1

Visual Studio 是否有与 GCC 的 -Wreturn-type 等效的警告(或多个警告)?

更具体地说,我正在寻找一个 Visual Studio 警告(或多个警告),它将针对返回类型不是

void
where

的函数中的实例发出警告
  1. 有一个
    return
    语句,没有返回值;或
  2. 函数执行可能会“脱离”函数体的末尾而不返回值

我不关心

-Wreturn-type
的其他部分,只要使用默认为
int
的返回类型定义函数就会发出警告。

作为参考,GCC 警告选项可以在这里找到。

c++ c visual-studio compiler-warnings
1个回答
1
投票

正如评论中指出的,这可以通过 C4033C4716C4715 来完成。

用户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 命令提示符发出的。

如果我遗漏了任何测试用例,请发表评论让我知道。

测试

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
没有值的函数

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
没有值的函数

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>
测试 C C++
测试1 没有警告或错误 触发 C4716 作为错误,即使未打开(这是有道理的,因为此警告的 文档 表示它会自动升级为错误,除非使用
#pragma warning
来防止这种情况)
测试2 没有警告或错误 触发器C2561(编译器错误)
测试3 触发器 C4715 触发器 C4715

这意味着 C4715 对于 C++ 来说足够了,但对于 C 来说还不够。

注释

如果您调用永不返回的函数,C4715 可能会发出警告。例如,如果您调用以

while (true) {}
throw "error message";
结尾的函数。为了避免这种情况,请使用
__declspec(noreturn)
声明永不返回的函数,或者如果您使用的是 C++11 或更高版本,则可以在函数声明中使用更可移植的
[[noreturn]]
。 (如果您调用像
exit()
这样的标准库函数,编译器不会发出警告,因为它知道该函数永远不会返回。)

有关一些有趣的相关讨论,请参阅为什么在不返回值的情况下从非 void 函数末尾流出不会产生编译器错误?

© www.soinside.com 2019 - 2024. All rights reserved.