2013-05-07 20 views
10

Przeglądałem /usr/include/stdio.hGdzie znaleźć struct _IO_FILE

i natknąłem się na następujący fragment kodu.

/* Standard streams. */ 

extern struct _IO_FILE *stdin;   /* Standard input stream. */ 
extern struct _IO_FILE *stdout;   /* Standard output stream. */ 
extern struct _IO_FILE *stderr;   /* Standard error output stream. */ 
/* C89/C99 say they're macros. Make them happy. */ 
#define stdin stdin 
#define stdout stdout 
#define stderr stderr 

Moje pytanie brzmi, gdzie jest ten stucture struct _IO_FILE oświadczył, chcę zobaczyć układ. a także kod wymienia

#define stdin stdin 

Jak to ma działać?

+0

Z jakiego systemu operacyjnego/kompilatora korzystasz? – templatetypedef

+0

** System operacyjny: ** 3.2.0-41-generic-pae # 66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013 – ArunMKumar

+0

** Kompilator: ** gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 – ArunMKumar

Odpowiedz

16

Jest w /usr/include/libio.h (co jest wliczone w stdio.h) i struct defintion jest:

struct _IO_FILE { 
    int _flags;   /* High-order word is _IO_MAGIC; rest is flags. */ 
#define _IO_file_flags _flags 

    /* The following pointers correspond to the C++ streambuf protocol. */ 
    /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ 
    char* _IO_read_ptr; /* Current read pointer */ 
    char* _IO_read_end; /* End of get area. */ 
    char* _IO_read_base; /* Start of putback+get area. */ 
    char* _IO_write_base; /* Start of put area. */ 
    char* _IO_write_ptr; /* Current put pointer. */ 
    char* _IO_write_end; /* End of put area. */ 
    char* _IO_buf_base; /* Start of reserve area. */ 
    char* _IO_buf_end; /* End of reserve area. */ 
    /* The following fields are used to support backing up and undo. */ 
    char *_IO_save_base; /* Pointer to start of non-current get area. */ 
    char *_IO_backup_base; /* Pointer to first valid character of backup area */ 
    char *_IO_save_end; /* Pointer to end of non-current get area. */ 

    struct _IO_marker *_markers; 

    struct _IO_FILE *_chain; 

    int _fileno; 
#if 0 
    int _blksize; 
#else 
    int _flags2; 
#endif 
    _IO_off_t _old_offset; /* This used to be _offset but it's too small. */ 

#define __HAVE_COLUMN /* temporary */ 
    /* 1+column number of pbase(); 0 is unknown. */ 
    unsigned short _cur_column; 
    signed char _vtable_offset; 
    char _shortbuf[1]; 

    /* char* _save_gptr; char* _save_egptr; */ 

    _IO_lock_t *_lock; 
#ifdef _IO_USE_OLD_IO_FILE 
}; 

szukałem definicji patrząc na obróbką kodu:

echo '#include<stdio.h>' | gcc -E - 
+0

To było naprawdę pomocne @KingsIndian, nie wiem zbyt wiele o poleceniu echo, więc możesz mi wyjaśnić komendę echo, której użyłeś wraz z parametrami, które przekazałeś. – ArunMKumar

+1

To właśnie wygląda na twoim systemie. W innym systemie może być zupełnie inaczej. –

+0

To samo, co włączenie stdio.h do programu C i przeglądanie wstępnie przetworzonego kodu. Opcje '-E' mówią gcc, aby zatrzymał się po etapie wstępnego przetwarzania po wszystkich włączeniach # include. –

1

możesz zrobić szukaj w ten sposób:

grep -rn "struct _IO_FILE {" --include="*.h" /usr/include