zoukankan      html  css  js  c++  java
  • 09.C语言:预处理(宏定义)、字节序、地址对齐

    一、预处理

      

    1 预处理
    2 gcc -E Hello.c -o hello.i
    3 编译
    4 gcc -S hello.i -o hello.s
    5 汇编
    6 gcc -c hello.s -o hello.o
    7 链接
    8 gcc hello.o -o hello
    Makefile
      1 # 1 "hello.c"
      2 # 1 "<built-in>"
      3 # 1 "<command-line>"
      4 # 1 "/usr/include/stdc-predef.h" 1 3 4
      5 # 1 "<command-line>" 2
      6 # 1 "hello.c"
      7 
      8 
      9 
     10 
     11 
     12 
     13 
     14 # 1 "/usr/include/stdio.h" 1 3 4
     15 # 27 "/usr/include/stdio.h" 3 4
     16 # 1 "/usr/include/features.h" 1 3 4
     17 # 374 "/usr/include/features.h" 3 4
     18 # 1 "/usr/include/i386-linux-gnu/sys/cdefs.h" 1 3 4
     19 # 385 "/usr/include/i386-linux-gnu/sys/cdefs.h" 3 4
     20 # 1 "/usr/include/i386-linux-gnu/bits/wordsize.h" 1 3 4
     21 # 386 "/usr/include/i386-linux-gnu/sys/cdefs.h" 2 3 4
     22 # 375 "/usr/include/features.h" 2 3 4
     23 # 398 "/usr/include/features.h" 3 4
     24 # 1 "/usr/include/i386-linux-gnu/gnu/stubs.h" 1 3 4
     25 
     26 
     27 
     28 
     29 
     30 
     31 # 1 "/usr/include/i386-linux-gnu/gnu/stubs-32.h" 1 3 4
     32 # 8 "/usr/include/i386-linux-gnu/gnu/stubs.h" 2 3 4
     33 # 399 "/usr/include/features.h" 2 3 4
     34 # 28 "/usr/include/stdio.h" 2 3 4
     35 
     36 
     37 
     38 
     39 
     40 # 1 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h" 1 3 4
     41 # 212 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h" 3 4
     42 typedef unsigned int size_t;
     43 # 34 "/usr/include/stdio.h" 2 3 4
     44 
     45 # 1 "/usr/include/i386-linux-gnu/bits/types.h" 1 3 4
     46 # 27 "/usr/include/i386-linux-gnu/bits/types.h" 3 4
     47 # 1 "/usr/include/i386-linux-gnu/bits/wordsize.h" 1 3 4
     48 # 28 "/usr/include/i386-linux-gnu/bits/types.h" 2 3 4
     49 
     50 
     51 typedef unsigned char __u_char;
     52 typedef unsigned short int __u_short;
     53 typedef unsigned int __u_int;
     54 typedef unsigned long int __u_long;
     55 
     56 
     57 typedef signed char __int8_t;
     58 typedef unsigned char __uint8_t;
     59 typedef signed short int __int16_t;
     60 typedef unsigned short int __uint16_t;
     61 typedef signed int __int32_t;
     62 typedef unsigned int __uint32_t;
     63 
     64 
     65 
     66 
     67 __extension__ typedef signed long long int __int64_t;
     68 __extension__ typedef unsigned long long int __uint64_t;
     69 
     70 
     71 
     72 
     73 
     74 
     75 
     76 __extension__ typedef long long int __quad_t;
     77 __extension__ typedef unsigned long long int __u_quad_t;
     78 # 121 "/usr/include/i386-linux-gnu/bits/types.h" 3 4
     79 # 1 "/usr/include/i386-linux-gnu/bits/typesizes.h" 1 3 4
     80 # 122 "/usr/include/i386-linux-gnu/bits/types.h" 2 3 4
     81 
     82 
     83 __extension__ typedef __u_quad_t __dev_t;
     84 __extension__ typedef unsigned int __uid_t;
     85 __extension__ typedef unsigned int __gid_t;
     86 __extension__ typedef unsigned long int __ino_t;
     87 __extension__ typedef __u_quad_t __ino64_t;
     88 __extension__ typedef unsigned int __mode_t;
     89 __extension__ typedef unsigned int __nlink_t;
     90 __extension__ typedef long int __off_t;
     91 __extension__ typedef __quad_t __off64_t;
     92 __extension__ typedef int __pid_t;
     93 __extension__ typedef struct { int __val[2]; } __fsid_t;
     94 __extension__ typedef long int __clock_t;
     95 __extension__ typedef unsigned long int __rlim_t;
     96 __extension__ typedef __u_quad_t __rlim64_t;
     97 __extension__ typedef unsigned int __id_t;
     98 __extension__ typedef long int __time_t;
     99 __extension__ typedef unsigned int __useconds_t;
    100 __extension__ typedef long int __suseconds_t;
    101 
    102 __extension__ typedef int __daddr_t;
    103 __extension__ typedef int __key_t;
    104 
    105 
    106 __extension__ typedef int __clockid_t;
    107 
    108 
    109 __extension__ typedef void * __timer_t;
    110 
    111 
    112 __extension__ typedef long int __blksize_t;
    113 
    114 
    115 
    116 
    117 __extension__ typedef long int __blkcnt_t;
    118 __extension__ typedef __quad_t __blkcnt64_t;
    119 
    120 
    121 __extension__ typedef unsigned long int __fsblkcnt_t;
    122 __extension__ typedef __u_quad_t __fsblkcnt64_t;
    123 
    124 
    125 __extension__ typedef unsigned long int __fsfilcnt_t;
    126 __extension__ typedef __u_quad_t __fsfilcnt64_t;
    127 
    128 
    129 __extension__ typedef int __fsword_t;
    130 
    131 __extension__ typedef int __ssize_t;
    132 
    133 
    134 __extension__ typedef long int __syscall_slong_t;
    135 
    136 __extension__ typedef unsigned long int __syscall_ulong_t;
    137 
    138 
    139 
    140 typedef __off64_t __loff_t;
    141 typedef __quad_t *__qaddr_t;
    142 typedef char *__caddr_t;
    143 
    144 
    145 __extension__ typedef int __intptr_t;
    146 
    147 
    148 __extension__ typedef unsigned int __socklen_t;
    149 # 36 "/usr/include/stdio.h" 2 3 4
    150 # 44 "/usr/include/stdio.h" 3 4
    151 struct _IO_FILE;
    152 
    153 
    154 
    155 typedef struct _IO_FILE FILE;
    156 
    157 
    158 
    159 
    160 
    161 # 64 "/usr/include/stdio.h" 3 4
    162 typedef struct _IO_FILE __FILE;
    163 # 74 "/usr/include/stdio.h" 3 4
    164 # 1 "/usr/include/libio.h" 1 3 4
    165 # 31 "/usr/include/libio.h" 3 4
    166 # 1 "/usr/include/_G_config.h" 1 3 4
    167 # 15 "/usr/include/_G_config.h" 3 4
    168 # 1 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stddef.h" 1 3 4
    169 # 16 "/usr/include/_G_config.h" 2 3 4
    170 
    171 
    172 
    173 
    174 # 1 "/usr/include/wchar.h" 1 3 4
    175 # 82 "/usr/include/wchar.h" 3 4
    176 typedef struct
    177 {
    178   int __count;
    179   union
    180   {
    181 
    182     unsigned int __wch;
    183 
    184 
    185 
    186     char __wchb[4];
    187   } __value;
    188 } __mbstate_t;
    189 # 21 "/usr/include/_G_config.h" 2 3 4
    190 typedef struct
    191 {
    192   __off_t __pos;
    193   __mbstate_t __state;
    194 } _G_fpos_t;
    195 typedef struct
    196 {
    197   __off64_t __pos;
    198   __mbstate_t __state;
    199 } _G_fpos64_t;
    200 # 32 "/usr/include/libio.h" 2 3 4
    201 # 49 "/usr/include/libio.h" 3 4
    202 # 1 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stdarg.h" 1 3 4
    203 # 40 "/usr/lib/gcc/i686-linux-gnu/4.8/include/stdarg.h" 3 4
    204 typedef __builtin_va_list __gnuc_va_list;
    205 # 50 "/usr/include/libio.h" 2 3 4
    206 # 144 "/usr/include/libio.h" 3 4
    207 struct _IO_jump_t; struct _IO_FILE;
    208 # 154 "/usr/include/libio.h" 3 4
    209 typedef void _IO_lock_t;
    210 
    211 
    212 
    213 
    214 
    215 struct _IO_marker {
    216   struct _IO_marker *_next;
    217   struct _IO_FILE *_sbuf;
    218 
    219 
    220 
    221   int _pos;
    222 # 177 "/usr/include/libio.h" 3 4
    223 };
    224 
    225 
    226 enum __codecvt_result
    227 {
    228   __codecvt_ok,
    229   __codecvt_partial,
    230   __codecvt_error,
    231   __codecvt_noconv
    232 };
    233 # 245 "/usr/include/libio.h" 3 4
    234 struct _IO_FILE {
    235   int _flags;
    236 
    237 
    238 
    239 
    240   char* _IO_read_ptr;
    241   char* _IO_read_end;
    242   char* _IO_read_base;
    243   char* _IO_write_base;
    244   char* _IO_write_ptr;
    245   char* _IO_write_end;
    246   char* _IO_buf_base;
    247   char* _IO_buf_end;
    248 
    249   char *_IO_save_base;
    250   char *_IO_backup_base;
    251   char *_IO_save_end;
    252 
    253   struct _IO_marker *_markers;
    254 
    255   struct _IO_FILE *_chain;
    256 
    257   int _fileno;
    258 
    259 
    260 
    261   int _flags2;
    262 
    263   __off_t _old_offset;
    264 
    265 
    266 
    267   unsigned short _cur_column;
    268   signed char _vtable_offset;
    269   char _shortbuf[1];
    270 
    271 
    272 
    273   _IO_lock_t *_lock;
    274 # 293 "/usr/include/libio.h" 3 4
    275   __off64_t _offset;
    276 # 302 "/usr/include/libio.h" 3 4
    277   void *__pad1;
    278   void *__pad2;
    279   void *__pad3;
    280   void *__pad4;
    281   size_t __pad5;
    282 
    283   int _mode;
    284 
    285   char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
    286 
    287 };
    288 
    289 
    290 typedef struct _IO_FILE _IO_FILE;
    291 
    292 
    293 struct _IO_FILE_plus;
    294 
    295 extern struct _IO_FILE_plus _IO_2_1_stdin_;
    296 extern struct _IO_FILE_plus _IO_2_1_stdout_;
    297 extern struct _IO_FILE_plus _IO_2_1_stderr_;
    298 # 338 "/usr/include/libio.h" 3 4
    299 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
    300 
    301 
    302 
    303 
    304 
    305 
    306 
    307 typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf,
    308      size_t __n);
    309 
    310 
    311 
    312 
    313 
    314 
    315 
    316 typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w);
    317 
    318 
    319 typedef int __io_close_fn (void *__cookie);
    320 # 390 "/usr/include/libio.h" 3 4
    321 extern int __underflow (_IO_FILE *);
    322 extern int __uflow (_IO_FILE *);
    323 extern int __overflow (_IO_FILE *, int);
    324 # 434 "/usr/include/libio.h" 3 4
    325 extern int _IO_getc (_IO_FILE *__fp);
    326 extern int _IO_putc (int __c, _IO_FILE *__fp);
    327 extern int _IO_feof (_IO_FILE *__fp) __attribute__ ((__nothrow__ , __leaf__));
    328 extern int _IO_ferror (_IO_FILE *__fp) __attribute__ ((__nothrow__ , __leaf__));
    329 
    330 extern int _IO_peekc_locked (_IO_FILE *__fp);
    331 
    332 
    333 
    334 
    335 
    336 extern void _IO_flockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
    337 extern void _IO_funlockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
    338 extern int _IO_ftrylockfile (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
    339 # 464 "/usr/include/libio.h" 3 4
    340 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict,
    341    __gnuc_va_list, int *__restrict);
    342 extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict,
    343     __gnuc_va_list);
    344 extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t);
    345 extern size_t _IO_sgetn (_IO_FILE *, void *, size_t);
    346 
    347 extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int);
    348 extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int);
    349 
    350 extern void _IO_free_backup_area (_IO_FILE *) __attribute__ ((__nothrow__ , __leaf__));
    351 # 75 "/usr/include/stdio.h" 2 3 4
    352 
    353 
    354 
    355 
    356 typedef __gnuc_va_list va_list;
    357 # 90 "/usr/include/stdio.h" 3 4
    358 typedef __off_t off_t;
    359 # 102 "/usr/include/stdio.h" 3 4
    360 typedef __ssize_t ssize_t;
    361 
    362 
    363 
    364 
    365 
    366 
    367 
    368 typedef _G_fpos_t fpos_t;
    369 
    370 
    371 
    372 
    373 # 164 "/usr/include/stdio.h" 3 4
    374 # 1 "/usr/include/i386-linux-gnu/bits/stdio_lim.h" 1 3 4
    375 # 165 "/usr/include/stdio.h" 2 3 4
    376 
    377 
    378 
    379 extern struct _IO_FILE *stdin;
    380 extern struct _IO_FILE *stdout;
    381 extern struct _IO_FILE *stderr;
    382 
    383 
    384 
    385 
    386 
    387 
    388 
    389 extern int remove (const char *__filename) __attribute__ ((__nothrow__ , __leaf__));
    390 
    391 extern int rename (const char *__old, const char *__new) __attribute__ ((__nothrow__ , __leaf__));
    392 
    393 
    394 
    395 
    396 extern int renameat (int __oldfd, const char *__old, int __newfd,
    397        const char *__new) __attribute__ ((__nothrow__ , __leaf__));
    398 
    399 
    400 
    401 
    402 
    403 
    404 
    405 
    406 extern FILE *tmpfile (void) ;
    407 # 209 "/usr/include/stdio.h" 3 4
    408 extern char *tmpnam (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;
    409 
    410 
    411 
    412 
    413 
    414 extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ;
    415 # 227 "/usr/include/stdio.h" 3 4
    416 extern char *tempnam (const char *__dir, const char *__pfx)
    417      __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ;
    418 
    419 
    420 
    421 
    422 
    423 
    424 
    425 
    426 extern int fclose (FILE *__stream);
    427 
    428 
    429 
    430 
    431 extern int fflush (FILE *__stream);
    432 
    433 # 252 "/usr/include/stdio.h" 3 4
    434 extern int fflush_unlocked (FILE *__stream);
    435 # 266 "/usr/include/stdio.h" 3 4
    436 
    437 
    438 
    439 
    440 
    441 
    442 extern FILE *fopen (const char *__restrict __filename,
    443       const char *__restrict __modes) ;
    444 
    445 
    446 
    447 
    448 extern FILE *freopen (const char *__restrict __filename,
    449         const char *__restrict __modes,
    450         FILE *__restrict __stream) ;
    451 # 295 "/usr/include/stdio.h" 3 4
    452 
    453 # 306 "/usr/include/stdio.h" 3 4
    454 extern FILE *fdopen (int __fd, const char *__modes) __attribute__ ((__nothrow__ , __leaf__)) ;
    455 # 319 "/usr/include/stdio.h" 3 4
    456 extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
    457   __attribute__ ((__nothrow__ , __leaf__)) ;
    458 
    459 
    460 
    461 
    462 extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __attribute__ ((__nothrow__ , __leaf__)) ;
    463 
    464 
    465 
    466 
    467 
    468 
    469 extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__));
    470 
    471 
    472 
    473 extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
    474       int __modes, size_t __n) __attribute__ ((__nothrow__ , __leaf__));
    475 
    476 
    477 
    478 
    479 
    480 extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
    481          size_t __size) __attribute__ ((__nothrow__ , __leaf__));
    482 
    483 
    484 extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    485 
    486 
    487 
    488 
    489 
    490 
    491 
    492 
    493 extern int fprintf (FILE *__restrict __stream,
    494       const char *__restrict __format, ...);
    495 
    496 
    497 
    498 
    499 extern int printf (const char *__restrict __format, ...);
    500 
    501 extern int sprintf (char *__restrict __s,
    502       const char *__restrict __format, ...) __attribute__ ((__nothrow__));
    503 
    504 
    505 
    506 
    507 
    508 extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
    509        __gnuc_va_list __arg);
    510 
    511 
    512 
    513 
    514 extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);
    515 
    516 extern int vsprintf (char *__restrict __s, const char *__restrict __format,
    517        __gnuc_va_list __arg) __attribute__ ((__nothrow__));
    518 
    519 
    520 
    521 
    522 
    523 extern int snprintf (char *__restrict __s, size_t __maxlen,
    524        const char *__restrict __format, ...)
    525      __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4)));
    526 
    527 extern int vsnprintf (char *__restrict __s, size_t __maxlen,
    528         const char *__restrict __format, __gnuc_va_list __arg)
    529      __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 0)));
    530 
    531 # 412 "/usr/include/stdio.h" 3 4
    532 extern int vdprintf (int __fd, const char *__restrict __fmt,
    533        __gnuc_va_list __arg)
    534      __attribute__ ((__format__ (__printf__, 2, 0)));
    535 extern int dprintf (int __fd, const char *__restrict __fmt, ...)
    536      __attribute__ ((__format__ (__printf__, 2, 3)));
    537 
    538 
    539 
    540 
    541 
    542 
    543 
    544 
    545 extern int fscanf (FILE *__restrict __stream,
    546      const char *__restrict __format, ...) ;
    547 
    548 
    549 
    550 
    551 extern int scanf (const char *__restrict __format, ...) ;
    552 
    553 extern int sscanf (const char *__restrict __s,
    554      const char *__restrict __format, ...) __attribute__ ((__nothrow__ , __leaf__));
    555 # 443 "/usr/include/stdio.h" 3 4
    556 extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) __asm__ ("" "__isoc99_fscanf")
    557 
    558                                ;
    559 extern int scanf (const char *__restrict __format, ...) __asm__ ("" "__isoc99_scanf")
    560                               ;
    561 extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) __asm__ ("" "__isoc99_sscanf") __attribute__ ((__nothrow__ , __leaf__))
    562 
    563                       ;
    564 # 463 "/usr/include/stdio.h" 3 4
    565 
    566 
    567 
    568 
    569 
    570 
    571 
    572 
    573 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
    574       __gnuc_va_list __arg)
    575      __attribute__ ((__format__ (__scanf__, 2, 0))) ;
    576 
    577 
    578 
    579 
    580 
    581 extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)
    582      __attribute__ ((__format__ (__scanf__, 1, 0))) ;
    583 
    584 
    585 extern int vsscanf (const char *__restrict __s,
    586       const char *__restrict __format, __gnuc_va_list __arg)
    587      __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__format__ (__scanf__, 2, 0)));
    588 # 494 "/usr/include/stdio.h" 3 4
    589 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vfscanf")
    590 
    591 
    592 
    593      __attribute__ ((__format__ (__scanf__, 2, 0))) ;
    594 extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vscanf")
    595 
    596      __attribute__ ((__format__ (__scanf__, 1, 0))) ;
    597 extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vsscanf") __attribute__ ((__nothrow__ , __leaf__))
    598 
    599 
    600 
    601      __attribute__ ((__format__ (__scanf__, 2, 0)));
    602 # 522 "/usr/include/stdio.h" 3 4
    603 
    604 
    605 
    606 
    607 
    608 
    609 
    610 
    611 
    612 extern int fgetc (FILE *__stream);
    613 extern int getc (FILE *__stream);
    614 
    615 
    616 
    617 
    618 
    619 extern int getchar (void);
    620 
    621 # 550 "/usr/include/stdio.h" 3 4
    622 extern int getc_unlocked (FILE *__stream);
    623 extern int getchar_unlocked (void);
    624 # 561 "/usr/include/stdio.h" 3 4
    625 extern int fgetc_unlocked (FILE *__stream);
    626 
    627 
    628 
    629 
    630 
    631 
    632 
    633 
    634 
    635 
    636 
    637 extern int fputc (int __c, FILE *__stream);
    638 extern int putc (int __c, FILE *__stream);
    639 
    640 
    641 
    642 
    643 
    644 extern int putchar (int __c);
    645 
    646 # 594 "/usr/include/stdio.h" 3 4
    647 extern int fputc_unlocked (int __c, FILE *__stream);
    648 
    649 
    650 
    651 
    652 
    653 
    654 
    655 extern int putc_unlocked (int __c, FILE *__stream);
    656 extern int putchar_unlocked (int __c);
    657 
    658 
    659 
    660 
    661 
    662 
    663 extern int getw (FILE *__stream);
    664 
    665 
    666 extern int putw (int __w, FILE *__stream);
    667 
    668 
    669 
    670 
    671 
    672 
    673 
    674 
    675 extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
    676      ;
    677 # 638 "/usr/include/stdio.h" 3 4
    678 extern char *gets (char *__s) __attribute__ ((__deprecated__));
    679 
    680 
    681 # 665 "/usr/include/stdio.h" 3 4
    682 extern __ssize_t __getdelim (char **__restrict __lineptr,
    683           size_t *__restrict __n, int __delimiter,
    684           FILE *__restrict __stream) ;
    685 extern __ssize_t getdelim (char **__restrict __lineptr,
    686         size_t *__restrict __n, int __delimiter,
    687         FILE *__restrict __stream) ;
    688 
    689 
    690 
    691 
    692 
    693 
    694 
    695 extern __ssize_t getline (char **__restrict __lineptr,
    696        size_t *__restrict __n,
    697        FILE *__restrict __stream) ;
    698 
    699 
    700 
    701 
    702 
    703 
    704 
    705 
    706 extern int fputs (const char *__restrict __s, FILE *__restrict __stream);
    707 
    708 
    709 
    710 
    711 
    712 extern int puts (const char *__s);
    713 
    714 
    715 
    716 
    717 
    718 
    719 extern int ungetc (int __c, FILE *__stream);
    720 
    721 
    722 
    723 
    724 
    725 
    726 extern size_t fread (void *__restrict __ptr, size_t __size,
    727        size_t __n, FILE *__restrict __stream) ;
    728 
    729 
    730 
    731 
    732 extern size_t fwrite (const void *__restrict __ptr, size_t __size,
    733         size_t __n, FILE *__restrict __s);
    734 
    735 # 737 "/usr/include/stdio.h" 3 4
    736 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
    737          size_t __n, FILE *__restrict __stream) ;
    738 extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,
    739           size_t __n, FILE *__restrict __stream);
    740 
    741 
    742 
    743 
    744 
    745 
    746 
    747 
    748 extern int fseek (FILE *__stream, long int __off, int __whence);
    749 
    750 
    751 
    752 
    753 extern long int ftell (FILE *__stream) ;
    754 
    755 
    756 
    757 
    758 extern void rewind (FILE *__stream);
    759 
    760 # 773 "/usr/include/stdio.h" 3 4
    761 extern int fseeko (FILE *__stream, __off_t __off, int __whence);
    762 
    763 
    764 
    765 
    766 extern __off_t ftello (FILE *__stream) ;
    767 # 792 "/usr/include/stdio.h" 3 4
    768 
    769 
    770 
    771 
    772 
    773 
    774 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
    775 
    776 
    777 
    778 
    779 extern int fsetpos (FILE *__stream, const fpos_t *__pos);
    780 # 815 "/usr/include/stdio.h" 3 4
    781 
    782 # 824 "/usr/include/stdio.h" 3 4
    783 
    784 
    785 extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    786 
    787 extern int feof (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    788 
    789 extern int ferror (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    790 
    791 
    792 
    793 
    794 extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    795 extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    796 extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    797 
    798 
    799 
    800 
    801 
    802 
    803 
    804 
    805 extern void perror (const char *__s);
    806 
    807 
    808 
    809 
    810 
    811 
    812 # 1 "/usr/include/i386-linux-gnu/bits/sys_errlist.h" 1 3 4
    813 # 26 "/usr/include/i386-linux-gnu/bits/sys_errlist.h" 3 4
    814 extern int sys_nerr;
    815 extern const char *const sys_errlist[];
    816 # 854 "/usr/include/stdio.h" 2 3 4
    817 
    818 
    819 
    820 
    821 extern int fileno (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    822 
    823 
    824 
    825 
    826 extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    827 # 873 "/usr/include/stdio.h" 3 4
    828 extern FILE *popen (const char *__command, const char *__modes) ;
    829 
    830 
    831 
    832 
    833 
    834 extern int pclose (FILE *__stream);
    835 
    836 
    837 
    838 
    839 
    840 extern char *ctermid (char *__s) __attribute__ ((__nothrow__ , __leaf__));
    841 # 913 "/usr/include/stdio.h" 3 4
    842 extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    843 
    844 
    845 
    846 extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;
    847 
    848 
    849 extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    850 # 943 "/usr/include/stdio.h" 3 4
    851 
    852 # 9 "hello.c" 2
    853 
    854 int main(int argc, char* argv[])
    855 {
    856     printf("Hello , world !
    ");
    857 
    858     return 0;
    859 }
    hello.i
     1     .file    "hello.c"
     2     .section    .rodata
     3 .LC0:
     4     .string    "Hello , world !"
     5     .text
     6     .globl    main
     7     .type    main, @function
     8 main:
     9 .LFB0:
    10     .cfi_startproc
    11     pushl    %ebp
    12     .cfi_def_cfa_offset 8
    13     .cfi_offset 5, -8
    14     movl    %esp, %ebp
    15     .cfi_def_cfa_register 5
    16     andl    $-16, %esp
    17     subl    $16, %esp
    18     movl    $.LC0, (%esp)
    19     call    puts
    20     movl    $0, %eax
    21     leave
    22     .cfi_restore 5
    23     .cfi_def_cfa 4, 4
    24     ret
    25     .cfi_endproc
    26 .LFE0:
    27     .size    main, .-main
    28     .ident    "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
    29     .section    .note.GNU-stack,"",@progbits
    hello.s

         gcc编译过程:http://lib.csdn.net/article/c/66184

      1.去掉程序中的注释;

      2.文件包含:当对C源程序进行预处理时,文件包含指的是将.c文件包含的头文件内容复制到当前.c文件中。

        1》、第一种:#include <stdio.h>  直接去系统头文件目录下寻找所包含的头文件。

        2》、第二种:#include "head.h"   先在当前目录下寻找所包含的头文件,如果找不到,则再去系统头文件目录下寻找所包含的头文件。

      3.宏替换

        当对C源程序进行预处理时,如果程序中有事先定义好的宏,则会将所有的宏后面的字符串替换,例如:

         

        1》预定义宏:   

    1 __FILE__       //正在编译的文件名(字符串常量)  
    2 __LINE__       //文件当前的行号(整型常量)
    3 __FUNCTION__    //当前所在的函数名(字符串常量)
    4 __DATE__      //预编译文件的日期(字符串常量)
    5 __TIME__      //预编译文件的时间(字符串常量)
    6 __STDC__      //判断编译器是否遵循ANSI C,是则为1(整型常量)
    Predefine Macros

          

         2》不带参数的宏:#define   宏名  字符串

     1 /*******************************************************************
     2  *   > File Name: noParamMacros.c
     3  *   > Author: fly
     4  *   > Mail: XXXXXXXX@icode.com
     5  *   > Create Time: Sun 17 Sep 2017 01:00:07 PM CST
     6  ******************************************************************/
     7 
     8 #include <stdio.h>
     9 
    10 #define PI  3.14*2
    11 #define M   60
    12 #define S   "HelloWorld"
    13 
    14 int main(int argc, char* argv[])
    15 {
    16     printf("%f
    ", PI);
    17     printf("%d
    ", M);
    18     printf("%s
    ", S);
    19 
    20     return 0;
    21 }
    noParamMacros.c

         3》带参数的宏:可以像函数一样被调用。

     1 /*******************************************************************
     2  *   > File Name: paramMacros.c
     3  *   > Author: fly
     4  *   > Mail: XXXXXXXX@icode.com
     5  *   > Create Time: Sun 17 Sep 2017 01:40:15 PM CST
     6  ******************************************************************/
     7 
     8 #include <stdio.h>
     9 
    10 #define FUN(a, b)   a+b*a
    11 
    12 #define     FALSE   0
    13 #define     TRUE    1
    14 
    15 int fun(int a, int b){
    16     return a+b*a;
    17 }
    18 
    19 int main(int argc, char* argv[])
    20 {
    21     int a = 5, b =3;
    22     int c;
    23 
    24     c = fun(a, b);  //函数调用
    25     printf("c = %d
    ", c);
    26 
    27     c = FUN(a, b);  //宏调用
    28 
    29     float f;
    30 
    31 #if (DataType == FALSE)
    32     f = fun(3.1, 4.5);  //Data type is error
    33     printf("f = %f
    ", f);
    34 #else
    35     f = FUN(3.1, 4.5);  //Data type is correct
    36     printf("f = %f
    ", f);
    37 #endif
    38 
    39     return 0;
    40 }
    paramMacros.c

          在上述例子中,由于传参时,可能会传一个表达式,这是调用带参宏就会导致结果不正确,所以一般在定义带参宏时,都会如下去定义:  #define  FUN(a, b)  (a)+(b)*(a)

      4.条件编译:在编译程序之前,按照某个条件来选择需要编译哪一段代码。

        1》第一种方式:

        

     1 /*******************************************************************
     2  *   > File Name: ifdef.c
     3  *   > Author: fly
     4  *   > Mail: XXXXXXXX@icode.com
     5  *   > Create Time: Sun 17 Sep 2017 02:51:43 PM CST
     6  ******************************************************************/
     7 
     8 #include <stdio.h>
     9 
    10 #define     DEBUG
    11 
    12 //有如下两个函数,如果要测试这两个函数是否正确,则必须写主函数测试
    13 void fun1(void){
    14     printf("hello world
    ");
    15 }
    16 
    17 void fun2(void){
    18     printf("This is a good idea !
    ");
    19 }
    20 
    21 //下面为测试代码
    22 #ifdef  DEBUG
    23 int main(int argc, char* argv[])
    24 {
    25     fun1();
    26     fun2();
    27 
    28     return 0;
    29 }
    30 #endif
    ifdef.c

        2》第二种方式:

        

     1 #ifdef __HEAD_H_
     2 #define __HEAD_H_
     3 
     4 #include <stdio.h>
     5 
     6 int x = 100;
     7 
     8 #endif
     9 
    10 //该条件编译的作用是,防止头文件被多次(重复)包含。
    ifndef

        3》第三种方式:

        

     1 //用于注释一段代码
     2 #if (0)
     3 #include "head.h"
     4 #include "head.h"
     5 #include "head.h"
     6 #include "head.h"
     7 #include "head.h"
     8 #include "head.h"
     9 #include "head.h"
    10 #include "head.h"
    11 #endif
    if.c

    二、字节序 

      1.计算机在存储多字节数据时,数据内部各个字节的存储顺序称为字节序;

          4字节:unsigned int word = 0x12345678;

            

      2.端序

        1》小端序(little-endian):最高有效位所在的字节放在最高字节位置,其他字节依次放在低字节位置,则该字节序称为高位优先。

        2》大端序(big-endian):最低有效位所在的字节放在最高字节位置,其他字节依次放在低字节位置,则该字节序称为低位优先。

     1 /*******************************************************************
     2  *   > File Name: endian.c
     3  *   > Author: fly
     4  *   > Mail: XXXXXXXX@icode.com
     5  *   > Create Time: Sun 17 Sep 2017 04:34:11 PM CST
     6  ******************************************************************/
     7 
     8 #include <stdio.h>
     9 #include <stdbool.h>
    10 
    11 #define FALSE   0
    12 #define TRUE    1
    13 
    14 bool is_little_endian(void){
    15     bool ret;
    16     unsigned int word = 0x12345678;
    17 
    18     unsigned char byte0 = *((unsigned char *)&word + 0);
    19     unsigned char byte1 = *((unsigned char *)&word + 1);
    20     unsigned char byte2 = *((unsigned char *)&word + 2);
    21     unsigned char byte3 = *((unsigned char *)&word + 3);
    22 
    23     printf("%p---->0x%hhx
    ", &byte0, byte0);
    24     printf("%p---->0x%hhx
    ", &byte1, byte1);
    25     printf("%p---->0x%hhx
    ", &byte2, byte2);
    26     printf("%p---->0x%hhx
    ", &byte3, byte3);
    27 
    28     if(byte0 == 0x78){
    29         printf("the machine is little endian !
    ");
    30         ret = TRUE;
    31     }else if(byte0 == 0x12){
    32         printf("the machine is big endian !
    ");
    33         ret = FALSE;
    34     }
    35 
    36     return ret;
    37 }
    38 
    39 int main(int argc, char* argv[])
    40 {
    41     if(is_little_endian() == TRUE){
    42         printf("Little endian is true !
    ");
    43     }
    44 
    45     return 0;
    46 }
    View Code

         执行结果: 

     1 /*******************************************************************
     2  *   > File Name: endian1.c
     3  *   > Author: fly
     4  *   > Mail: XXXXXXXX@icode.com
     5  *   > Create Time: Sun 17 Sep 2017 05:02:58 PM CST
     6  ******************************************************************/
     7 
     8 #include <stdio.h>
     9 
    10 union A{
    11     unsigned int word;
    12     unsigned char byte;
    13 };
    14 
    15 int main(int argc, char* argv[])
    16 {
    17     union A un;
    18 
    19     un.word = 0x12345678;
    20     if(un.byte == 0x78){
    21         printf("the machine is little endian !
    ");
    22     }else if(un.byte == 0x12){
    23         printf("the machine is big endian !
    ");
    24     }
    25 
    26     return 0;
    27 }
    使用结构体判断大小端序

    三、地址对齐

      为了提高CPU从内存中存取数据的效率,在给数据分配内存空间时,会有意的将数据放在某些地址位置,这种分配空间的方式称为地址对齐。  

      1》自然对齐:在给数据分配空间是时,如果数据的起始地址能够被数据的长度整除,则该分配空间的方式为自然对齐。

      2》数据的M值:

        对于每一个数据都有M值,M值如下:

          1)对于基本数据类型:

            如果该数据的长度小于机器字字长,则它的M值为自身的长度;

            如果该数据的长度大于或者等于机器字长,则它的M值为机器字长;

          2)对于数组:

            M值为元素的M值;

          3)对于结构体,共用体:

            M值为成员中最大的M值;

      3》适当对齐:在给数据分配空间时,如果数据的起始地址能够被数据的M值整除,则该分配空间的方式为适当对齐。

      4》结构体的存储:

     1 /*******************************************************************
     2  *   > File Name: align.c
     3  *   > Author: fly
     4  *   > Mail: XXXXXXXX@icode.com
     5  *   > Create Time: Sun 17 Sep 2017 05:15:23 PM CST
     6  ******************************************************************/
     7 
     8 #include <stdio.h>
     9 
    10 struct param{
    11     char a;
    12     short b;
    13     int c;
    14 };
    15 
    16 struct param1{
    17     char a;
    18     int b;
    19     short c;
    20 };
    21 
    22 int main(int argc, char* argv[])
    23 {
    24     struct param p1;
    25     printf("sizeof(struct param) = %d	sizeof p1 = %d
    ", sizeof(struct param), sizeof p1);
    26 
    27     struct param1 p2;
    28     printf("sizeof(struct param1) = %d	sizeof p2 = %d
    ", sizeof(struct param1), sizeof p2);
    29 
    30     return 0;
    31 }
    structAlign.c

       执行结果:

  • 相关阅读:
    5、Android Service测试
    javassist示例
    HeaderExchangeClient
    dubbo 心跳
    javassist和jdk动态代理
    dubbo为consumer创建代理
    线程同步知识点
    SynchronousQueue类
    Executors类的newFixedThreadPool, newCachedThreadPool, newScheduledThreadPool
    eclipse设置条件断点
  • 原文地址:https://www.cnblogs.com/feige1314/p/7535537.html
Copyright © 2011-2022 走看看