stdout 是 C++ 中本机可用的标记吗?

Is stdout a natively usable token in C++?

假设我有一个类似

的函数
void printToSomewhere(FILE* stream, char* msg){
    fprintf(stream, "%s", msg);
}

如果我希望流成为 stdout,我是否必须在调用函数之前声明:

...
FILE* stdout;
printToSomewhere(stdout, "printing to stdout");
...

或者我可以调用该函数而不必显式 define/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, "Hello\n");
    fclose(f);
    return 0;
}

预期输出:

Hello