假设我有一个类似的函数
void printToSomewhere(FILE* stream, char* msg){
fprintf(stream, "%s", msg);
}
如果我希望流是stdout
,我必须在调用函数之前声明吗
...
FILE* stdout;
printToSomewhere(stdout, "printing to stdout");
...
或者我可以在不必显式定义/include/etc/stdout的情况下调用函数吗?
...
printToSomewhere(stdout, "printing to stdout");
...
对于每个变量,在使用之前都必须声明stdout
。变量stdout
在头文件stdio.h
(或C++中的cstdio
)中声明。通过包括stdio.h
(或cstdio
),stdout
变得可见。
在许多平台上,您也可以简单地将stdout
声明为外部变量:
extern FILE *stdout;
尽管不鼓励这样做,因为C标准要求stdout
是一个宏,并允许它扩展到甚至不是变量的东西。然而,在大多数平台上,stdio.h
将该宏定义为
#define stdout stdout
但是您应该避免在可移植软件中做出这种假设。
是。STDOUT始终是文件描述符1(由POSIX强制执行)。
这将起作用:
#include <stdio.h>
#include <stdlib.h>
void printToSomewhere(FILE* stream, const char* msg){
fprintf(stream, "%s", msg);
}
int main()
{
FILE* f = fdopen(1, "w+");
printToSomewhere(f, "Hellon");
fclose(f);
return 0;
}
预期输出:
Hello