C语言——预处理

C语言编译步骤

预处理

编译

汇编

链接

预处理

概念:

预处理就是在源文件(如.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理程序自动来完成;当源文件在编译时,编译器会自动调用预处理程序来完成对预处理指令的解析,预处理指令解析完成才能进入下一步的编译过程。
我们为了能够方便的看到这个编译细节,我们可以使用下面命令:

cs 复制代码
gcc 源文件 -E -o 程序名[.后缀]

预处理的功能

宏定义

不带参数的宏定义

语法:

cs 复制代码
#define 宏名 常量数据

预处理:

此时的预处理只做数据替换,不做类型检查

注意:

我们定义的宏是不会占用内存空间,还没有到编译环节,就已经被替换成了我们宏中的常量数据

带参数的宏定义

语法:

cs 复制代码
#define 宏名(参数列表) 参数表达式

面试题:

cs 复制代码
#define multi(a,b) a * b
/**
 * 宏定义-带参数
 */
#include <stdio.h>

#define MULTI(a,b) a * b

int main()
{
    int result = MULTI(7+2,3);
    
    printf("%d\n",result);// 13 

    return 0;
}

宏定义的作用域

#define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。

可以用 #undef 命令终止宏定义的作用域

文件包含

概念:

所谓"文件包含"处理是指一个源文件可以将另外一个源文件的全部内容包含进来。这个适用于多文件开发。

预处理

此时的预处理,是将文件中的内容替换,文件包含指令。

包含方式:

第1种:

#include<xxxx.h>

系统会到标准库头文件目录(Linux下/usr/include )查找包含的文件

第2种:

#include"xxxx.h"

在当前工程路径下查找,如果未找到,系统会到标准库头文件目录查找

案例:

algorithm.h

/**

* 自定义头文件,专门用于存放被外部访问的函数的声明

*/

// 数组的累加和计算

extern int sum(const int *p,int len);

algorithm.c

/**

* 实现数组元素的累加计算

*/

int sum(const int *p,int len)

{

int sum = 0;

register int i = 0;

for(;i len; i++)

{

sum += *(p+i);

}

return sum;

}

app.c

// #include

// 引入自定义的头文件

#include "algorithm.h"

// 如果有n多个外部函数,难道都要一个个的使用extern进行声明?

// 引入外部函数声明

// extern int sum(const int*,int);

int main()

{

int arr[5] = {12,33,14,55,34};

int res = sum(arr,5);

printf("数组累和结果是:%d\n",res);

return 0;

}

编译命令:

gcc algorithm.c app.c -o app // 有包含关系的c文件要一起编译

条件编译

概念

根据设定的条件选择待编译的语句代码。

预处理

将满足条件的语句进行保留,不满足条件的语句进行删除,交给下一步编译

语法:

语法一:

#ifdef 标识------判断标识没有定义执行ifdef语句,定义执行else

...

#else

...

#endif
语法二:

#ifndef 标识------判断标识没有定义执行ifdef语句,定义执行else

...

else

...

#endif
语法三:

#if 表达式------根据表达式返回的结果:0不成立(执行else语句),1成立(执行if语句)

...

#else

...

#endif

避免头文件重复包含的方法

语法:

#ifndef __XXXX_H

#define __XXXX_H

...

#endif

案例:

algorithm.h

/**

* 自定义头文件,专门用于存放被外部访问的函数的声明

*/

#ifndef __ALGORITHM_H

#define __ALGORITHM_H

// 数组的累加和计算

extern int sum(const int *p,int len);

#endif

相关推荐
资深web全栈开发1 小时前
[特殊字符]图解 Golang 反射机制:从底层原理看动态类型的秘密
开发语言·后端·golang
顾安r4 小时前
11.8 脚本网页 星际逃生
c语言·前端·javascript·flask
LaoZhangGong1235 小时前
STM32 F103外部晶振8MHz改为12MHz,如何配置?
c语言·stm32·单片机·嵌入式硬件·晶振
独隅6 小时前
在 Lua 中,你可以使用 `os.date()` 函数轻松地将时间戳转换为格式化的时间字符串
开发语言·lua
思麟呀6 小时前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释6 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释7 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
lkbhua莱克瓦247 小时前
Java基础——集合进阶3
java·开发语言·笔记
多喝开水少熬夜7 小时前
Trie树相关算法题java实现
java·开发语言·算法
QT 小鲜肉7 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习