2017-12-27 56 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 to/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를 사용할 수 있습니다.)