簡體   English   中英

與 GCC 的 -Wreturn-type 等效的 Visual Studio 警告是什么?

[英]What is the Visual Studio warning equivalent of GCC's -Wreturn-type?

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

更具體地說,我正在尋找一個 Visual Studio 警告(或多個警告),它將警告函數中返回類型不是void的實例

  1. 有沒有返回值的return語句; 或者
  2. function 執行可能會“脫落” function 主體的末尾而不返回值

我不關心-Wreturn-type的另一部分,它會在 function 定義為默認為int的返回類型時發出警告。

作為參考,可以在此處找到 GCC 警告選項。

正如評論中所指出的,這可以通過C4033C4716C4715來完成。

用戶n。 1.8e9-where's-my-share m。 對如何查找 MSVC 警告也提出了一個很好的觀點:

如果您想了解是否存在您想要的警告,只需啟用所有 [使用/Wall ] 並針對一小段代碼進行測試。 如果有警告,恭喜,你找到了。 如果沒有,那么運氣不好,沒有。

我使用.c.cpp文件擴展名測試兩者,以防編譯器根據它正在編譯的語言表現不同(果然,測試2的行為不同)。

我的測試都沒有抱怨過main() ,因為main()是特殊的,因為它是 C 和 C++ 中唯一的0return

以下所有測試均使用 Visual Studio 2015 的編譯器(即C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe )完成,命令是從 VS2015 x86 Native Tools 命令發出的迅速的。

如果我遺漏了任何測試用例,請發表評論讓我知道。

測試

C 測試

測試 1 - 具有int返回類型的空 function

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 - Function 具有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 - Function 具有int返回類型,其中執行可能“脫落” function 的末尾

此測試表明這些警告還不夠,因為此代碼沒有發出警告或錯誤。

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返回類型的空 function

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 - Function 具有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 - Function 具有int返回類型,其中執行可能“脫落” function 的末尾

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 來說還不夠。

筆記

如果您調用永不返回的 function,C4715 可能會發出警告。 例如,如果您調用以while (true) {}結尾的 function 或throw "error message"; . 為避免這種情況,請使用__declspec(noreturn)聲明永不返回的 function ,或者如果您使用的是 C++11 或更新版本,則可以在 ZC1C42145268E68394F 聲明中使用更便攜的[[noreturn]] (如果你調用標准庫 function 像exit() ,編譯器不會發出警告,因為它會知道 function 永遠不會返回。)

對於一些有趣的相關討論,請參閱為什么在不返回值的情況下從非 void function 的末尾流出不會產生編譯器錯誤? .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM