zoukankan      html  css  js  c++  java
  • C语言预处理

    1、由源码到可执行程序的过程
    (1)源码.c->(编译)->elf可执行程序
    (2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序
    (3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序
    (4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

    预处理是将原本的C文件进行处理,将宏展开。头文件展开。形成预处理过的.i源文件本质也是c语言文件。

    2、编程中常见的预处理
    (1)#include(#include <>和#include ""的区别)
    (2)注释
    (3)#if #elif #endif #ifdef
    (4)宏定义

      #include(#include <>和#include ""的区别)

    <>只会去系统默认的文件夹寻找头文件,""会首先寻找当前文件夹,然后去系统默认文件夹寻找。

      预处理过程中会将头文件原地展开。

    abc.c文件

    #include"abc.h"
    int main()
    {
     func();
    return 0; }

    abc.h文件

    typedef  unsigned char  uchar
    uchar fun();

    执行 gcc -E abc.c -o abc.i

    abc.i文件

    typedef  unsigned char  uchar
    uchar fun();
    int main() {
     func();
      return 0;      
    }

      注释

      在预处理后,注释不会出现在.i文件中

      #if #elif #endif #ifdef 条件编译

    .c文件

    #include<stdio.h>
    #define LED
    int main() {
      #ifdef LED
    ·· printf("#ifdef ");
      #else
      aa=2;
      c=aaa
      dasdasdasd// 编译之前预处理时会将这种情况去掉,所以不抱错,
        printf("#else
    ");
        #endif
        printf("main-1");
        
        printf("main-2");
        return 0;
    }

    .i文件

    /*
    ......
    */
    int main()
    {    
    
        aa=1;
        printf("#ifdef
    ");
    
        printf("main-1");
        
        printf("main-2");
        return 0;
    }

    预处理时,将不符合条件的代码取消。并不检查c语法问题。

      宏定义

    .c

    #include<stdio.h>
    #define TEAR_S (365*24*60*60UL)
    int main()
    {    
        printf("YEAR_S=%u
    ",TEAR_S);
        return 0;
    }

    .i 

    ...
    int main()
    {    printf("YEAR_S=%u
    ", (365*24*60*60UL));
        return 0;
    }

    对于宏进行完全替换

     

  • 相关阅读:
    Android程序反编译的方法(转)
    VMware的Easy Install安装
    Oracle ORA12514:TNS:监听程序当前无法识别连接描述符中请求的服务
    Java Eclipse 如何导入外部Jar包
    Oracle IMP00010: 不是有效的导出文件,标题验证失败
    怎样取消Windows 2003 server 意外关机提示
    没有文件扩展“.vbs”的脚本引擎的解决方案
    Oracle init.ora常用配置详解
    eclipse断点调试 出现Source not found
    VMware Workstation 8
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6262870.html
Copyright © 2011-2022 走看看