[英]control reaches end of non-void function with custom exit function
在嘗試刪除我的GCC警告代碼時,我發現了一個奇怪的錯誤/行為。 我的程序使用了一個自定義退出函數,該函數執行一些清理操作,最后調用exit()
。
但是,我使用此退出函數導致GCC產生虛假警告:
通過自定義退出功能,控制達到非void功能的結尾
導致此錯誤的程序示例如下:
FILE1.C:
extern void CleanExit(int ExitCode);
int MyFunc(int ErrorCode)
{
if(-1 == ErrorCode)
return -1;
if(1 == ErrorCode)
return 1;
if(2 == ErrorCode)
return 0;
if(3 == ErrorCode)
CleanExit(0);
CleanExit(-1);
}
file2.c中:
void CleanExit(int ExitCode)
{
/* Do Some Cleanup */
exit(ExitCode);
}
是否有某種方法可以消除這些警告,而不會在使用此結構的每個函數中添加無用的東西呢?
我寧願使用標准C來這樣做,但願意在需要時使用某種GCC編譯指示。
您用GCC標記了您的問題。 因此,不是將函數從void
更改為int
並在任何地方添加return
,您可以嘗試使用GCC指定屬性。 在CleanExit()
聲明之上添加__attribute__((noreturn))
。 這將提醒編譯器CleanExit()
永遠不會直接返回給調用者。
這應該做到這一點
extern int CleanExit(int ExitCode);
int MyFunc(int ErrorCode)
{
if(-1 == ErrorCode)
return -1;
if(1 == ErrorCode)
return 1;
if(2 == ErrorCode)
return 0;
if(3 == ErrorCode)
return CleanExit(0);
return CleanExit(-1);
}
int CleanExit(int ExitCode)
{
/* Do Some Cleanup */
exit(ExitCode);
}
這些警告是不是偽造- 有從函數返回(並最終由來自返回退出之間的差異main
),並調用exit()
的另一個函數內終止整個程序。 在這種情況下,你真的不需要知道這些差異,但如果你願意,你可以閱讀 它們 。
在這種情況下,問題在於您的函數的簽名。 期望MyFunc
返回一個int
,但是在CleanExit
時則不會。 結果,編譯器抱怨缺少返回(但是足夠智能以識別exit
調用並在返回的位置記錄它)。
要解決此問題,只需在CleanExit
之后添加一個懸空的返回CleanExit
。 因為CleanExit
將終止整個程序,所以您不必擔心該值的重要性:
...
CleanExit(-1);
return -1;
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.