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

    C语言预处理理论
    1、从源码到可执行文件的过程
    (1)源码.c->(编译)->elf可执行程序
    (2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序
    (3)源码.c->(编译)->汇编文件.s->(汇编)->目标文件.o->(链接)->
    (4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.s->(汇编)->目标文件.o->(链接)->elf可执行程序
    2、预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上一些其他的额外会用到的可用工具,
    合起来叫编译工具链。gcc就是一个编译工具链。
    3、预处理的意义
    (1)编译器本身的主要目的是编译源代码,将C的源代码转化成.S的汇编代码。编译器聚焦核心功能后,就剥离出了一些
    非核心的功能到预处理器去了。
    (2)预处理帮编译器做一些编译前的杂事。
    4、编程中常见的预处理
    (1)#include(#include <>和#include""的区别)
    (2)注释
    (3)#if #elif #endif #ifdef
    (4)宏定义
    5、gcc中只预处理不编译的方法
    (1)gcc编译时可以给一些参数来做一些设置,譬如gcc xx.c -o xx可以指定可执行程序的名称,譬如gcc xx.c -c -o xx.o
    可以指定只编译不链接,也可以生成.o的目标文件。
    (2)gcc -E xx.c -o xx.i可以实现只预处理不编译。一般情况下,没必要只预处理不编译,但是有时候这种技巧可以帮助我们
    研究预处理过程,帮助debug程序。
    总结:宏定义被预处理时的现象有:第一,宏定义语句不见了(可见编译器根本就不认识#define);第二,typedef重命名语句
    还在,说明他和宏定义是有本质区别的(说明typedef是由编译器来处理而不是预处理器处理的)。
    实例:

    源码.c

    1 #define pchar char *
    2 typedef char * PCHAR
    3 int main(void)
    4 {
    5     pchar p3;
    6     pchar p1,p2;
    7     return 0;
    8 }

    预处理之后的文件.i

    1   
    2 typedef char * PCHAR
    3 int main(void)
    4 {
    5     char * p3;
    6     char * p1,p2;
    7     return 0;
    8 }
  • 相关阅读:
    Yii2的深入学习--行为Behavior
    使用WordPress搭建自己的博客
    php-resque的设计和使用
    PHP的学习--在Atom中使用XDebug(Mac)
    七牛镜像的使用
    macOS平台下虚拟摄像头的研发总结
    macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号
    XCode日常使用备忘录
    DirectShow Filter的开发实践
    Windows下程序启动时出现0xc000007b错误的解决方案
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11729404.html
Copyright © 2011-2022 走看看