预处理

本文最后更新于:2023年12月5日 晚上

新建一个 c 文件,hello.c

#include <stdio.h>
int main()
{
    puts("hello word");
    return 0;
}

然后

gcc ./hello.c

在当前目录下生成 a.out 可执行文件。

./a.out

输出 hello word 。

这个编译过程经过了四个步骤:

  1. .c 文件 -> .i 文件 预处理
  2. .i 文件 -> .s 文件 编译
  3. .s 文件 -> .o 文件 汇编
  4. .o 文件 -> .out 可执行文件 链接

预处理

gcc -o hello.i hello.c -E
# -o 参数是让生成 .i 文件, -E参数是只执行预处理,后面的步骤不执行

宏定义

#define R 20

define 中是没有 c 语法的,只是单纯的字符串替换

宏非常简单,就是“替换”

宏函数

typedef

typedef 和预处理没什么关系, 但是和宏比较容易混淆.

它的作用是给变量类型起别名

条件编译

#if

#if 整型常量表达式 1
	程序段 1
#elif 整型常量表达式 2
	程序段 2
#elif 整型常量表达式 3
	程序段 3
#else
	程序段 4
#endif

它的意思是:如常“表达式 1”的值为真(非 0),就对“程序段 1”进行编译,否则就计算“表达式 2”,结果为
真的话就对“程序段 2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。这一
点和 if else 非常类似。
需要注意的是,#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须
是整数;而 if 后面的表达式没有限制,只要符合语法就行。这是 #if 和 if 的一个重要区别。

#ifdef

#ifdef 宏名
	程序段 1
#else
	程序段 2
#endif

它的意思是,如果当前的宏已被定义过,则对“程序段 1”进行编译,否则对“程序段 2”进行编译。

#ifndef

#ifndef 宏名
	程序段 1
#else
	程序段 2
#endif

与 #ifdef 相比,仅仅是将 #ifdef 改为了 #ifndef。它的意思是,如果当前的宏未被定义,则对“程序段 1”进行编
译,否则对“程序段 2”进行编译,这与 #ifdef 的功能正好相反。

三者之间的区别

最后需要注意的是,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是
其他的。


预处理
http://blog.lujinkai.cn/C/预处理/
作者
像方便面一样的男子
发布于
2020年12月11日
更新于
2023年12月5日
许可协议