c语言 if预处理的条件编译的作用,C语言23 终极篇 预处理之宏定义、条件编译和文件包含...

本文详细介绍了C语言预处理的概念及应用,包括宏定义、条件编译和文件包含等内容。通过对简单宏、带参数宏及多行定义的讲解,帮助读者理解预处理的工作原理,并通过实例展示了宏定义在代码中的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言23 终极篇 预处理之宏定义、条件编译和文件包含

什么是预处理

预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。

预处理功能主要包括宏定义,文件包含,条件编译三部分

宏定义

简单宏: #define 标识符 字符序列

#define FALSE 0

#define NAME "LUODAOYI"

#define __IN

#define __OUT

//极端例子

#define NAME "LUODAOYI"

#define A int method() {

#define B char buffer[0x10];

#define C strcpy(buffer,NAME);

#define D return 0;}

#define E method();

//使用

A

B

C

D

int main()

{

E

return 0;

}

带参数的宏 #define 标识符(参数表) 字符序列

#define MAX(A,B)((A)>(B)?(A):(B))

int method()

{

int x = 1;

int y = 2;

int z = MAX(x,y);

return 0;

}

// 多行定义 // '\' 后不可有空格

#define A for(int i=0;i

{\

printf("%d \n",arr[i]);\

}\

int method(int arr[],int length)

{

A

return 0;

}

int main()

{

int arr[] = {1,2,3,4,5,6,7,8,9,0};

method(arr,10);

}

//直接使用宏定义函数

#define MYPRINT(X,Y) for(int i=0;i

{\

printf("%d \n",(X)[i]);\

}\

return 0;\

int main()

{

int arr[] = {1,2,3,4,5,6,7,8,9,0};

MYPRINT(arr,10);

}

//使用宏定义函数和普通函数的区别

// 使用宏比较节省空间 因为使用宏定义函数 没有堆栈提升操作,也就是不会作为函数调用而是直接内联到代码内

宏定义的注意事项:

只作字符序列的替换工作,不做任何语法检测,在编译前处理。

宏名标识符与左圆括号之前不允许有空白符,应紧接在一起。

为了避免出错,宏定义中给形参加上括号

多行声明时,回车换行前要加上字符'',即 '[enter]',主意字符''后要紧跟回车键,中间不能有空格或其他字符

末尾不需要分号

条件编译与文件包含

什么是条件编译

查看下面代码的反汇编

#include "stdafx.h"

int main(int argc,char* argv[])

{

#if 0

printf("--------")

#endif

return 0;

}

//应用场景

#include "stdafx.h"

#define DEBUG 0

int main(int argc,char* argv[])

{

#if DEBUG

printf("--------")

#endif

return 0;

}

预处理指令:条件编译时通过预处理指令实现的

指令

用途

#define

定义宏

#undef

取消已定义的宏

#if

如果给定条件为真,则编译下面代码

#endif

如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

#else

同else

#endif

结束一个#if…#else条件编译块

#ifdef

如果宏已经定义,则编译下面代码

#ifndef

如果宏没有定义,则编译下面代码

#include

包含文件

多条件条件编译例子

#define A

int main(int argc, char* argv[])

{

#if define A

printf("-----------1 \n");

#elif define B

printf("-----------2 \n");

#else

printf("-----------3 \n");

#endif

return 0;

}

预处理指令举例

#undef TRUE //取消true定义

#define TRUE 1 //定义TRUE

#if defined a //如果a定义了

#undef a //解除A的定义

#define a 200 //重新定义a

#endif //结束#IF

#ifndef a //如果a没有定义

#define a 100 //定义a

#endif //结束#IF

#ifdef a //如果定义了a

#define b 100 //定义b

#endif //结束#IF

文件包含

文件包含有两种格式

分辨是 #include "file" 和 #include

使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的"包含文件目录"(由用户在配置环境时设置)去找

使用尖括号:直接到系统指定的“包含文件目录”去查找

总结:

系统文件用 <>

自己定义的文件用 ""

重复包含

pass

如何解决重复包含问题?

条件编译

前置声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值