c的预处理

c的编译流程

  1. 预处理阶段
  2. 编译阶段
  3. 汇编阶段
  4. 链接阶段
  5. 运行可执行文件

查看预处理阶段的变化

源文件 src/pretreatment.c

/* src/pretreatment.c */
#include "pretreatment.h"
#define HAHAHA 1;
typedef unsigned int uint;
int main(void)
{
        int a = HAHAHA;
        return 0;
}

源文件 include/pretreatment.h

int pretreatment = 11;

使用gccE选项预编译

gcc -E -o bin/pretreatment.i src/pretreatment.c -I include

编译后内容

# 1 "src/pretreatment.c"
# 1 "<built-in>"
# 1 "<命令行>"
# 1 "src/pretreatment.c"
# 1 "include/pretreatment.h" 1
int pretreatment = 11;
# 2 "src/pretreatment.c" 2

typedef unsigned int uint;
int main(void)
{
 int a = 1;;
 return 0;
}

编译出来的文件还是文本文件,只是对预编译指令作了处理,如把宏替换,把#include用饱含的文件内容替换

预处理的概念

  • 预编译指令:以#开头的为预处理指令,如#define,#include等,在源程序中这些指令都放在函数外,而且一般都放在源文件的前面,他们被称为预处理部分。
  • 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是c语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。
  • 预处理在源代码编译之前对其进行一些文本性质的操作,在源程序编译之前作一些处理,生成扩展的c源程序。

预处理的任务

  • 删除注释
  • 插入被#include指令包含的文件内容
  • 定义和替换由#define指令定义的符号(宏替换或宏展开)
  • 条件编译

预处理指令的格式

  • #开头
  • 占单独书写行
  • 语句尾不加分好

合理的使用预处理,编写的程序便于阅读,修改,移植和调试,也有利于模块化的设计

宏定义的概念

  • 在c程序源程序中允许使用一个标识符来表示一个字符串,成为,在预处理时,对程序中所有出现的宏,都用宏定义的字符串去替换,这称为宏替换或宏展开
  • 宏定义是由源程序中的宏定义指令完成的,宏替换是由预处理程序自动完成的
  • 在c语言中,宏定义分为无参宏定义和带参宏定义

标签: c, 预处理

添加新评论