2017-11-22 11 views
0

私は自分のモジュールで "使いやすい"出力リダイレクトを書こうとしていました。いくつかのファイルとstdinの間でfprintfの出力を変更すると仮定します。 だから私のような何かを考えて:私は、任意の標準入力の宣言を見つけることができませんでし私のシステムを検索`stdin`マクロ宣言はどこにありますか?

void _connection(char mode) { /* pass 'v' as an argument to set verbous mode*/ 
     FILE *stream 

     if (mode == 'v') 
     fopen(stream, "stdin location?"); 
     else 
     fopen(stream, "../stream"); 

     fprintf(stream, "Connecting to the queue..."); 
     ... 
     fprintf(stream, "Some detail information..."); 
     --- 

。私のシステム上のstdio.hソースファイルはこのマクロを使用していますが、どこから取得するのかはわかりません。つまり、このファイルには入力ファイルやstdinというマクロはありません。

+0

@EugeneSh依存します。 – iBug

+0

@iBugうん、それはマクロかもしれない。コメント –

答えて

1

ここ(UNIXの場合)、それを探す:

/usr/include/stdio.h 

またはWindows上:POSIXはそれらを必要としながら、ISO C規格では、マクロであることをstdin/stdout/stderrが必要であることを

(Compiler Path)\include\stdio.h 

注意を外部FILE*の識別子である必要がありますので、POSIX準拠のシステム(Linuxなど)でこれを見ることができます:

#define stdin stdin 
+1

を削除しました。C標準(いずれのバージョン)でもマクロである必要があります。これはFILEオブジェクトへのポインタ "FILEへのポインタ"の式で、それぞれ標準エラー、入力、出力に関連付けられていますストリーム。 – Lundin

+0

POSIXはC標準との矛盾を避け、マクロも必要とします:_ [[ '](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdio.h.html)ヘッダーは以下のマクロを定義するものとします。入力ストリームと出力ストリームのそれぞれに関連付けられたFILEオブジェクトを指すタイプ "ポインタへのポインタ"の式に展開します: 'stderr'標準エラー出力ストリーム。 'stdin'標準入力ストリームです。 'stdout'標準出力ストリーム。 '#define stdin stdin'などのマクロを停止するものはありません。Macでは、内部名にマッピングされています:' #define stdin __stdinp'。 –

0

stdinマクロは、stdio.hまたは最終的に含まれるファイルに定義されています。限り、#include <stdio.h>あなたはそれにアクセスする必要があります。

何をしているのか、別々に開く必要はありません。ファイルポインタにstdinをコピーしてください:

if (mode == 'v') 
    stream = stdin; 
    else 
    fopen(stream, "../stream"); 
+0

いいえ、stdinマクロはstdio.h、periodに定義されています。これは7.21.1によって明示的に指定される。 – Lundin

+1

@ Lundin ''ヘッダが '#include 'で完全に 'stdin'を定義している場合、' stdin'を定義する ''となると私は主張します。 –

+0

しかし、 'fclose(stream)'になるときには、 'stream = stdin;'をあらかじめ設定しておけばそれを避けたいかもしれません。 – rici

関連する問題