2013-10-14 35 views
1

我知道這是一個簡單的問題,但我期待讓我的C++槽。我會想象某種abort函數可以使用。但我不認爲這會返回任何文字,如die('hello');會。有沒有C++等價於PHP的var_dump和死亡?

+1

因此,打印文本和*然後*退出? – Ryan

+0

好的,那將是一條路。只是想知道是否有一個命令來做到這一點,並打印 – Shamoon

回答

7

在C或C++中沒有「打印消息,然後退出」。你可以很容易地編寫自己的功能die(或panic,因爲我更喜歡稱呼它),這樣的:

void die(const std::string& msg) 
{ 
    std::cerr << msg << std::endl; 
    exit(1); 
} 

或者,如果你想避免的問題創建一個字符串,它可以在失敗低存儲器conditons:

void die(const char *msg) 
... 

(其餘應該是與上述相同)。這裏的缺點是你不能簡單地連接字符串,例如die(std::string("Could not open file ") + filename);將不適用於const char *

函數var_dump要難得多,因爲沒有直接的方法來實際獲取C++中任意類型或數組的變量的內容。你也許可以這樣做:

template<typename T> 
void var_dump(const T& var) 
{ 
    std::cout << var << endl; 
} 

template<typename T, size_t N> 
void var_dump(const T (&var)[N]) 
{ 
    for(i : var) 
    { 
     std::cout << i << endl; 
    } 
} 

後者有點像這樣的PHP代碼:foreach($var as $i) echo $i . "\n";。我可能會有語法錯誤,不確定。

+0

我不會在這裏使用'std :: string',在失敗的情況下,它很可能會失敗。 –

+0

@ BenVoigt:如果「失敗」是內存不足,可能是的。對於大多數其他失敗,可能不會......我已經將它改爲「const」引用,這應該避免必須複製。 –

+0

此外,任何與堆損壞相關的失敗。對於錯誤記錄來說,假設一個具有定義良好的行爲的程序並不明智。 –

2

我不建議撥std::abort,std::exit或類似的東西。

它是蠻力的,正確清理的語義非常複雜。你基本上離開(至少部分)你的程序處於非常混亂的狀態。

一個更好的在C++的方式是拋出一個異常,你再搭上在main

#include <stdexcept> 

struct fatal_error : std::logic_error { 
    fatal_error(char const* message) : std::logic_error(message) { } 
}; 

int main() try { 
    … the normal program flow starts here 
} catch (fatal_error const& e) { 
    std::cerr << e.what() << '\n'; 
    return EXIT_FAILURE; 
} 

然後,而不是die,你會簡單地說throw fatal_error("Something went wrong.");

+0

+1 PHP不爲人知的好設計巔峯...... – GManNickG

+0

*「拋出一個異常,然後你在'main'中捕獲」* - 呃,不。爲什麼無條件地發現異常,你不知道如何處理?不,只要讓它通過,如果你不知道該怎麼做。順便提一下,這與OP所要求的更接近。C++中未捕獲的異常的語義現在已經很好地被指定了。 – IInspectable

+0

@IInspectable當寫這個答案時,未捕獲的異常導致未指定或未定義(不記得哪些)行爲和泄露的資源。但是,除此之外,沒有最終用戶希望看到來自未捕獲異常的輸出。更好地控制格式。 –

0

假設你需要這些等同物用於調試目的...

代替模具()可能調用調試器;

而不是var_export()你可以用調試器檢查你的變量內容。

+0

不使用VC++。那麼,我將如何調用調試器? – Shamoon

+0

http://www.hermetic.ch/cfunlib/debug.htm – Paolo