c++ - 与 GCC 的 -Wreturn-type 等效的 Visual Studio 警告是什么?

标签 c++ c visual-studio compiler-warnings

Visual Studio 是否有相当于 GCC 的 -Wreturn-type 的警告(或警告)? ?

更具体地说,我正在寻找一个 Visual Studio 警告(或多个警告),它会针对返回类型不是 void 的函数中的实例发出警告,其中

  1. 有一个没有返回值的return语句;或
  2. 函数执行可能会“掉落”到函数体的末尾而不返回值

我不关心 -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>
<表类="s-表"> <头> 测试 C <日>C++ <正文> 测试一 没有警告或错误 触发 C4716 作为错误,即使它没有打开(这是有道理的,因为 docs for this warning 说它会自动升级为错误,除非使用 #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/

相关文章:

c# - 在一个事件中设置 'int' 并在另一事件中使用它

c++ - 将矩阵拆分为小矩阵 block 的方法

c - 浮点值条件

c - Strlen Valgrind 大小 1 的无效读取

c - fopen() 的非 ascii 文件名

c# - 在 TFS 待办事项板中按列名称获取工作项

windows - 如何在没有 visual studio 的情况下运行 windows phone 8 模拟器?

c++ - libusb.h 有可用的 C++ 示例吗?

c++ - 如果它被声明为 double ,如何在数字中添加逗号?

c++ - 用于 Windows 的 python ncreduce