2013-12-13 76 views
1

我要去看看K&R。我有点困惑以下摘录stdio.hstdin,stdout和stderr对标准输入和标准输出的实际调整

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]) 

这里FILE被定义为一个结构,并且stdinstdoutstderrFILE类型的数组的前三个构件。那么(&_iob[0])(&_iob[1])(&_iob[2])standard input devicestandard output device的赋值写在哪里呢?

回答

1

这里,_iob[OPEN_MAX];被声明为extern变量为extern FILE _iob[OPEN_MAX];。这意味着,_iob[OPEN_MAX];由其他代码填充,并且有一个初始代码,该代码分配为(&_iob[0]), (&_iob[1]) or (&_iob[2]) to stdin, stdout and stderr

+0

那么你甚至说'FILE'已经在别的地方声明过了吗? – noufal

+0

@noufal你听起来很惊讶。是的,通常它必须在某处被声明才能被使用。你从'fopen()'调用得到的是一个'FILE *',它指向由库以某种方式分配的“FILE”,并填充相关信息。但是这个声明必须由图书馆来完成,而不是应用程序员的业务。 – glglgl

1

此分配可能由在main()之前运行的一些初始化代码执行。

此代码是 - 除其他外 - 应该将这些数组条目链接到它们各自的文件描述符,这些文件描述符已被操作系统的装载程序打开。

相关问题