2016-04-15 133 views
4

程序可以用各種不同的狀態碼退出。
我想綁定一個退出處理程序作爲基於此狀態代碼處理最終任務的所有方式。
是否可以在退出處理程序中分配狀態代碼?
據我所知,No爲什麼沒有std :: on_exit?

因此,我無法獲得狀態值,如在這個小例子:

#include <iostream> 
#include <cstdlib> 

int Get_Return_Code(){ 
    //can this be implemented? 
    return 0; 
} 

void Exit_Handler() { 

    // how do I get the return code 
    // from within the exit heandler? 
    auto return_code = Get_Return_Code(); //? 

    // I'd like to make decisions based on the return code 
    // while inside my exit handler 
    if (return_code == EXIT_SUCCESS){ 
     std::cout << "perform exit successful tasks...\n"; 
    } 
    else { 
     std::cout << "perform exit failure tasks...\n"; 
    } 
} 

int main(int argc, char** argv) 
{ 
    //bind the exit handler routine 
    if (std::atexit(Exit_Handler)){ 
     std::cerr << "Registration failed\n"; 
     return EXIT_FAILURE; 
    } 

    //if an argument is passed, exit with success 
    //if no argument is passed, exit with failure 
    if (argc > 1){ 
     std::cout << "exiting with success\n"; 
     return EXIT_SUCCESS; 
    } 

    std::cout << "exiting with failure\n"; 
    return EXIT_FAILURE; 
} 

是否有一個原因,C++還不包括on_exit
我很擔心Windows世界中的交叉兼容性。

關於代碼庫:
我這樣做的目標,不涉及內存管理。我們有一個現有的代碼庫。到處都有退出聲明。當程序退出時出現錯誤,我想顯示錯誤代碼對用戶意味着什麼。在我看來,這是沒有重大重構的最快解決方案。

+0

因爲不需要?只需將代碼包裝在try/catch/finally塊中,你現在可以做同樣的事情。當語言沒有異常處理時,需要退出處理程序 –

+0

您可以自己實現'exit()',覆蓋標準庫的版本,並在完成任何想要的操作後調用'_exit()'數字代碼。我不確定這是一個好主意,但如果你真的需要,它可能是一種獲得你想要的東西的方法。 –

+0

@PanagiotisKanavos只需'try-catch',C++中不需要'finally'。 – juanchopanza

回答

1

最簡單和最便攜的解決方案是將程序包裝在shell腳本或其他程序中。然後,該包裝腳本或程序可以檢查退出代碼並向用戶顯示適當的消息。

+0

這是針對我們特定問題的最佳解決方案。 –

10

由於清理任務應該由您的析構函數執行,並且您的代碼應該在所有情況下(通過return或)正常返回任何範圍。

at_exit是RAII友好世界中的反模式。

如果您想要執行某些邏輯,具體取決於您要從main返回的內容,只需在從main返回時執行此操作即可。在main

+0

這很公平。我的情況並不真正涉及內存管理。我們有一個現有的代碼庫。到處都有退出聲明。當程序退出時出現錯誤,我想顯示錯誤代碼對用戶意味着什麼。在我看來,這是沒有重大重構的最快解決方案。 –

+0

如果你想在你從主返回之後做些什麼,情況如何? – Alex

+0

@Alex:然後你可以在你回來之前把你想要的東西放在'main'裏。 –

相關問題