c语言中的编译预处理命令

注意:
1. 所有编译预处理语句以”#“开头
2. 每个预处理命令必须单独占一行
3. 语句末尾不使用分号作为结束符
4. 预处理语句主要有宏,条件编译和文件包含

5. 有以下几类在这里插入图片描述

一、宏

1.无参宏
定义语句的格式如下:
#define 标识符 字符串

作用: 用一个简单的名称代替一个长的字符串。

标识符 称为”宏名“
在编译时将宏名替换成字符串的过程称为”宏展开“或宏替换

作用范围:定义之后,直到本文件末尾,但可用#undef终止作用域
注意:宏不用带分号

2.带参宏
定义格式:
#define 标识符(标识符1,标识符2,标识) 字符串
如:#define area(a) ((a)*(a))

作用:也是简单的将字符串替换成宏名,但其中的形式参数要对应实际参数

注意:

  1. 一切都要带括号,整个值和每个参数都要带括号
  2. 使用带参宏只是简单的将宏名替换成字符串,不进行任何计算
  3. 宏替换的过程在编译时就进行,不占用运行时间,占用编译时间
  4. 宏名是无类型的,即使有参数,那也是无类型的,宏替换只是简单将宏名替换成字符串
  5. 可以带多个参数,也可以嵌套其他宏

3.还有下列几种预处理宏(是双下划线)

__ LINE__ 表示正在编译的文件的行号
__FILE__表示正在编译的文件的名字
__DATE__表示编译时刻的日期字符串,例如: “25 Dec 2007”
__TIME__表示编译时刻的时间字符串,例如: “12:30:55”
__STDC__判断该文件是不是定义成标准 C 程序

4.宏的好处和坏处

宏优点1代码复用性2提高性能

宏缺点1 不可调试(预编译阶段进行了替换),2无类型安全检查3可读性差,容易出错。

这里附上《c和指针》中的一张表格,总结宏和函数十分到位,我就不多说了
在这里插入图片描述
宏函数很皮,#define定义一个比如判断大小,替换常量,很是方便。

不过我现在也就用下,#define ERROR_POWEROFF -1,#define _CRT_SECURE_NO_WARNINGS 1这样的和编译器有关的东西,不会去写宏函数,宏函数这东西,可读性特别差,在c++中,一般用const/枚举/内联去替代宏。

但是,define宏在某些方面真的是非常好用,我很推荐。

1.替代路径

#define ENG_PATH_1 C:\Program Files (x86)

2.针对编译器版本不兼容报错

#define _CRT_SECURE_NO_WARNINGS 1

二、include命令

所谓文件包含即使指在一个文件中将另一个文件的内容包含进来的处理过程

形式:
#include <包含文件名> 或者#include “包含文件名”

功能:在源程序进行编译之前,用包含文件的内容取代该文件的预处理语句

  • 尖括号表示在包含文件目录中查找(用户在设置环境时设置的),而不是在源文件目录去查找。
  • 双引号表示现在当前源文件目录中查找,若没找到再去包含目录中查找。
  • 系统库文件用尖括号,用户自定义的文件用双引号。

三、条件编译

(1)形式一:
#ifdef 标识符
程序段 1
#else
程序段 2
#endif

功能是如果标识符已被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。#else和程序段2可以没有。
例如:

#include <stdio.h>
#define MAX 10
int main()
{
	#if MAX>99
		printf("选用大于99的值编译源程序")#else
		printf("选用较小的值编译");
	#endif
	return 0;

输出:选用较小的值编译

(2)形式二:
#ifndef 标识符
程序段 1
#else
程序段 2
#endif
功能是如果标识符未被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。与形式一相反。

————————————————
转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41143631/article/details/81221777
原文链接:https://blog.csdn.net/qq_43700217/article/details/86586360

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值