I Wanna know the Internal Members of struct FILE, the latest ones

后端 未结 3 1831
情歌与酒
情歌与酒 2020-12-17 01:01

When I read pg.176 of The C programming Language by K&R, I was very excited. I found all the members of struct FILE ( which I was searching for ) and its just awesome to

3条回答
  •  北海茫月
    2020-12-17 01:21

    Answer of the @unwind is good, but I found another one workaround for the Unix-like systems with the GCC.

    Unfortunately, the C has not support for the reflection (Reflection support in C), but you may can parse a output the C preprocessor.


    Source code of shell script

    setivolkylany$~/Downloads$ cat script.sh 
    
    # a tempfile for source code on the C programming language
    FILE_C=`tempfile`
    
    # a tempfile for preprocessor`s output
    FILE_I=`tempfile`
    
    printf "#include \"stdio.h\"\nint main() {return 0;}" > $FILE_C
    cpp $FILE_C > $FILE_I
    
    # parse content of the tempfile for preprocessor`s output
    # and display only the structure
    print_it=false
    while read line; do
        if [ "$line" == "struct _IO_FILE {" ]; then
            print_it=true
        fi;
        if [ "$print_it" = true ]; then
            echo $line
        fi;
        if [ "$line" == "};" ]; then
            print_it=false
        fi;
    done < $FILE_I
    
    # clean tempfiles
    rm $FILE_C $FILE_I
    

    Output

    setivolkylany$~/Downloads$ ./script.sh 
    struct _IO_FILE {
    int _flags;
    
    
    
    
    char* _IO_read_ptr;
    char* _IO_read_end;
    char* _IO_read_base;
    char* _IO_write_base;
    char* _IO_write_ptr;
    char* _IO_write_end;
    char* _IO_buf_base;
    char* _IO_buf_end;
    
    char *_IO_save_base;
    char *_IO_backup_base;
    char *_IO_save_end;
    
    struct _IO_marker *_markers;
    
    struct _IO_FILE *_chain;
    
    int _fileno;
    
    
    
    int _flags2;
    
    __off_t _old_offset;
    
    
    
    unsigned short _cur_column;
    signed char _vtable_offset;
    char _shortbuf[1];
    
    
    
    _IO_lock_t *_lock;
    # 293 "/usr/include/libio.h" 3 4
    __off64_t _offset;
    # 302 "/usr/include/libio.h" 3 4
    void *__pad1;
    void *__pad2;
    void *__pad3;
    void *__pad4;
    size_t __pad5;
    
    int _mode;
    
    char _unused2[15 chrome-remote-desktop_current_amd64.deb data_structures_algorithms_tutorial.pdf dict-uk_ua-3-5-1.oxt getline.c jquery-3.1.1.min.js ld-linux.so (1).2 ld-linux.so.2 Makefile Portable Microsoft Office 2003.exe Python-3.5.2 script.sh teamviewer_12.0.71510_amd64.deb teamviewer_12.0.71510_i386.deb text_editor.zip sizeof (int) - 4 chrome-remote-desktop_current_amd64.deb data_structures_algorithms_tutorial.pdf dict-uk_ua-3-5-1.oxt getline.c jquery-3.1.1.min.js ld-linux.so (1).2 ld-linux.so.2 Makefile Portable Microsoft Office 2003.exe Python-3.5.2 script.sh teamviewer_12.0.71510_amd64.deb teamviewer_12.0.71510_i386.deb text_editor.zip sizeof (void *) - sizeof (size_t)];
    
    };
    

    This decision is no very delicate, but rather an attempt implementation reflection in the C programming language.

提交回复
热议问题