簡體   English   中英

通過自定義退出功能,控制達到非void功能的結尾

[英]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.

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