[英]What is the Visual Studio warning equivalent of GCC's -Wreturn-type?
Visual Studio 是否有與 GCC 的-Wreturn-type
等效的警告(或警告)?
更具體地說,我正在尋找一個 Visual Studio 警告(或多個警告),它將警告函數中返回類型不是void
的實例
return
語句; 或者我不關心-Wreturn-type
的另一部分,它會在 function 定義為默認為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
返回類型的空 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
測試 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 獲得相同的行為,這是我的結果。 我用來測試的命令是
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.