2015-11-12 27 views
-3

說我有喜歡是標準輸出本地可用的標記在C + +?

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

的功能。如果我想流是stdout,我必須在此之前宣佈在調用函數:

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

或者我可以調用函數不必須明確定義/包含/ etc stdout?

... 
printToSomewhere(stdout, "printing to stdout"); 
... 
+1

請選擇C和C++之一。 – fuz

+1

由於缺乏研究努力而被低估。 –

+0

@BaummitAugen我不確定應該在什麼樣的'研究努力'應用於人們甚至不確定如何說出他們所問的問題的情況下。 – galois

回答

4

與每個變量一樣,您必須在使用它之前聲明stdout。變量stdout在頭文件stdio.h(或C99中的cstdio)中聲明。通過包括stdio.h(或cstdio),stdout變得可見。

在許多平臺上,你也可以簡單地聲明stdout爲外部變量:

extern FILE *stdout; 

這樣做雖然不鼓勵,因爲C標準要求stdout做個宏,並允許其擴大的東西,甚至不是一個變量。在大多數plaforms然而,stdio.h定義這個宏只是作爲

#define stdout stdout 

,但你應該作出該假設便攜式軟件避免。

+0

標準說'stdout'是一個宏,所以'extern FILE * stdout;'在某些平臺上不起作用。 – kakkoko

+0

@kakkoko更正措辭以結合這一事實。我完全忘記了這一點。 – fuz

0

是的。 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 
+0

這樣做可能會在較早的Unices上產生奇怪的結果,這些結果使用'FILE'指針的固定表作爲'fdopen()'調用覆蓋文件描述符0的現有FILE'結構。另外,stdout始終是文件描述符1,而不是0,你應該使用宏'STDOUT_FILENO'而不是硬編碼它。 – fuz

+0

答案更正了,mea culpa。這將是一個非常老的(非posix)unix,因爲這是真的。當然,這是一個特例,而且OP不太可能遇到的情況? –

+0

我實際上不確定是否允許再次打開文件。讓我來問。 – fuz

相關問題