2017-12-27 55 views
1

std :: coutの評価順序に関するいくつかの質問がありましたが、std :: coutの引数の間にシーケンスポイントがないことを理解していますが、理解できません次のコードはどのように動作するか:C++と関数呼び出しの評価順序

saved_fd = dup(STDOUT_FILENO); 
std::cout << "Redirecting std out to /dev/null"; 
redirect_stdout() 
<do some stuff> 
std::cout << "Restoring std out back to standard output"; 
restore_stdout(); 

マイ関数redirect_stdout()とrestore_stdoutを()、dup2の呼び出しを使用しての/ dev/nullに、標準出力をリダイレクトし、それが後で戻って復元します。私は画面上に表示される唯一の出力は "std outを/ dev/nullにリダイレクト"することです。しかし、私が見ているのは、標準出力に標準出力を戻すことです。

redirect_stdout()が前のステートメントの前に実行されているようです。

ただ完全を期すため、ここでは二つの方法の定義は以下のとおりです。

void redirect_stdout() 
{ 
    dump_fd = open("/dev/null", O_RDWR, 0777); 
    dup2(dump_fd, STDOUT_FILENO); 
    cout << endl; 
} 

void restore_stdout() 
{ 
    dup2(saved_fd, STDOUT_FILENO); 
    cout << endl; 
} 

私が最初にCOUT出力が表示されないのはなぜ?

+4

私の水晶玉は、それはあなたのためだと言う:

修正は出力をフラッシュすることですリダイレクトする前にフラッシュしないでください。 '' std :: flush'を試してください。 – HolyBlackCat

+0

標準的な 'iostreams'ベースのクラスは、内部的に多くのバッファリングを使用します。私はそれらを洗うことで十分か、これがいつも未定義であるかどうかは分かりませんが、どこから始めるのかは分かりません。 –

答えて

1

どちらの場合も、答えは「バッファリング」です。 coutに出力を送信すると、バッファがいっぱいになるまで、または出力をフラッシュするまで、ファイル記述子1に送信されません。

saved_fd = dup(STDOUT_FILENO); 
std::cout << "Redirecting std out to /dev/null" << std::flush; 
redirect_stdout() 
<do some stuff> 
std::cout << "Restoring std out back to standard output" << std::flush; 
restore_stdout(); 

(代わりにstd::flushの、あなたも出力を改行を出力し、フラッシュstd::endlを使用することができます。)