2013-12-13 1 views
1

나는 갈거야 K&R. 나는 다음의 발췌문 인 stdio.h과 혼동을 느낀다. 여기 FILE 표준 입력 및 표준 출력에 stdin, stdout 및 stderr 실제 assingment

typedef struct _iobuf { 
    int cnt; /* characters left */ 
    char *ptr; /* next character position */ 
    char *base; /* location of buffer */ 
    int flag; /* mode of file access */ 
    int fd;  /* file descriptor */ 
} FILE; 

extern FILE _iob[OPEN_MAX]; 

#define stdin (&_iob[0]) 
#define stdout (&_iob[1]) 
#define stderr (&_iob[2]) 

는 구조로 정의되고, stdinstdoutstderr FILE 유형의 배열의 처음 세 개의 부재이다. 따라서 (&_iob[0]), (&_iob[1]) 또는 (&_iob[2]) ~ standard input devicestandard output device의 할당은 어디에 쓰여 집니까?

답변

1

여기에서 _iob[OPEN_MAX];extern FILE _iob[OPEN_MAX];으로 변수 extern으로 선언됩니다. 즉, _iob[OPEN_MAX];은 다른 코드로 채워져 있으며, 할당되는 초기 코드가 있습니다.

+0

그래서'FILE'도 전에 다른 곳에서 선언했다고 말하고 있습니까? – noufal

+0

@noufal 당신은 놀랐습니다. 예, 일반적으로 사용하기 위해 어딘가에 선언해야합니다. 'fopen()'호출에서 얻는 것은 라이브러리에 의해 어떤 수단에 의해 할당되고 관련 정보로 채워진'FILE'를 가리키는'FILE * '입니다. 그러나이 선언은 라이브러리에 의해 수행되어야하며 어플리케이션 프로그래머의 업무가 아닙니다. – glglgl

1

이 할당은 아마도 main() 이전에 실행되는 일부 초기화 코드에 의해 수행되었을 것입니다.

이 코드는 다른 것들 중에서도이 어레이 항목을 OS의 로더가 이미 열려있는 각각의 파일 설명자에 연결해야합니다.