常见预处理

预处理 ——#

预处理功能:宏定义、文件包含、条件编译。

预处理命令
#include(文件包含命令)
#define(宏定义命令)
#undef
#if(条件编译)
#ifdef
#ifndef
#elif
#endif
defined函数(与if等结合使用)

一、#include——文件包含

第一种----尖括号

#include <stdio.h>

第二种----双引号

#include "stdio.h"

使用尖括号和双引号的区别在于头文件的搜索路径

尖括号:编译器会到系统路径下查找头文件

双引号:编译器会先在当前目录下查找头文件,如果没有找到,再到系统路径下查找

二、#ifndef——条件编译

1.作用:

#ifndef 是"if not defined"的简写,是预处理功能当中的条件编译,可以根据是否已经定义了一个变量来进行分支选择,其作用是:

1、防止头文件被重复包含和编译;

2、便于程序的调试和移植;

#ifndef起到的效果是防止一个源文件多次包含同一个头文件

2.应用:

一般把头文件的内容都放在#ifndef和#endif中吧。不管你的这个头文件会不会被多个文件引用,你最好都加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>......
头文件内容
......#endif
eg. stdio.h

(标识的明明规则一般是头文件名全大写,前面加下划线,并把文件名中的"."也变成下划线)

#ifndef _STDIO_H
#define _STDIO_H......
stdio.h文件的内容
......#endif
3.应用
#ifndef 标识符#define 标识符程序段 1#else程序段 2#endif

三、#define ——宏定义

它的作用是当“标识符”没有由#define定义过,则编译“程序段1”,否则编译“程序段2”。

格式:#define 标识符 字符串

并不是所有情况下#define所定义的字符串都会被替换,有一种特殊情况:被替换的字符串在""内

代码示例:

#include <stdio.h>#define MX 10   //一般把#define写在所有函数之外
#define C  (4 * 1024)
#define ABS(x)            (((HATA_S32)(x) < 0) ? (-(HATA_S32)(x)) : (HATA_S32)(x))
#define MAX(a, b)         (((a) > (b)) ? (a) : (b))
//宏定义函数
#define CHECK_ERROR(state, error_code) 
if (state)                                  
{                                           return error_code;                      
}
//int main()
{#define MN 0printf("MX");int a, b=MX, c=MN;c = MAX(a, b) ;//宏定义表达式CHECK_ERROR(c != 10, 0x01);
}

1.定义位置:在某个函数内,还是在所有函数之外(不太建议把#define写在函数内),
2.#define作用域:不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。
typedef:如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾;如果放在某个函数内,它的作用域就是从它定义开始直到该函数结尾。
不管是typedef还是define,其作用域都不会扩展到别的文件。即使是同一个程序的不同文件,也不能互相使用。
3.内存:#define和声明、定义都不同,宏定义不占内存空间,因为宏在预处理阶段就会被替换掉,到了编译的阶段是没有宏存在的,它在预编译阶段就被处理了
#define(宏定义)----由预处理器来处理

四、#undef

typedef----在编译阶段由编译器处理

上文提到#define的作用域是从它声明开始到文件结尾,#undef就是取消之前的宏定义(也就是#define的标识符)

格式:#undef 标识符(注意:如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令)

#include <stdio.h>#define MAX 10
int main()
{printf("%d", MAX);
#undef MAX
#define    MAX 20printf("%d", MAX);
}

五、#if

#if命令要求判断条件为整型常量表达式,也就是说表达式中不能包含变量,而且结果必须是整数;而if后面的表达式没有限制,只要符合语法就行,这是#if和if的一个重要区别。

#include "stdio.h"
#define MAX 10
int main()
{printf("MAX = %d\n", MAX);#if    MAX == 10printf("MAX已被定义\n");
#elseprintf("MAX未被定义\n");#undef MAX#define    MAX 20
#endifprintf("MAX = %d\n", MAX);return 0;
}

六、#ifdef

#ifdef的作用是判断某个宏是否定义,如果该宏已经定义则执行后面的代码,一般使用格式如下

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

它的意思是,如果该宏已被定义过,则对程序段1进行编译,否则对程序段2进行编译(这个和上面的#if一样最后都需要#endif),上述格式也可以不用#else,这一点上和if else相同

代码示例:

#include <stdio.h>#define MAX 10
int main()
{
#ifdef MAXprintf("MAX已被定义\n");
#elseprintf("MAX未被定义\n");#undef MAX#define    MAX 20
#endifprintf("MAX = %d\n", MAX);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬取robomaster论坛数据,作为后端数据

一. 内容简介 python爬取robomaster论坛数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析 # 接口分析 # 全部数据 # https://bbs.robomaster.com/forum.php?modforumdisplay&fid63 2…

LeetCode343. Integer Break

文章目录 一、题目二、题解 一、题目 Given an integer n, break it into the sum of k positive integers, where k > 2, and maximize the product of those integers. Return the maximum product you can get. Example 1: Input: n 2 Output: 1 Explanation: 2 1 …

Ubuntu systemd-analyze命令(系统启动性能分析工具:分析系统启动时间,找出可能导致启动缓慢的原因)

文章目录 Ubuntu systemd-analyze命令剖析目录简介systemd与systemd-analyze工作原理 安装和使用命令参数详解用例与示例显示启动时间&#xff08;systemd-analyze time&#xff09;列出启动过程中各个服务的启动时间&#xff08;systemd-analyze blame&#xff09;显示系统启动…

Linux中office环境LibreOffice_7.6.2下载

阿里云盘&#xff1a;LibreOffice_7.6.2 使用&#xff1a;下载的文件为exe文件&#xff0c;双击exe文件即可获取到文件 LibreOffice_7.6.2安装&#xff1a; 解压&#xff1a;tar -zxvf LibreOffice_7.6.2_Linux_x86-64_rpm.tar.gz 移动到RPMS目录&#xff1a;cd LibreOffice_7…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一&#xff0c;其旨在有选择地提取图像的某些特征&#xff0c;可以用于在给定应用程序的上下文中传达重要信息&#xff0c;例如&#xff0c;去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

QT之QNetworkAccessManager

文章目录 成员函数例程 成员函数 1&#xff09;QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data) 该函数用于发送 HTTP POST 请求&#xff0c;将数据作为请求体发送。 2&#xff09;QNetworkReply *put(const QNetworkRequest &req…

厦门城市建设与建筑结构健康监测系统的重要性与作用

厦门&#xff0c;这座美丽的海滨城市&#xff0c;随着经济的快速发展和城市化的不断推进&#xff0c;城市建设已成为人们关注的焦点。其中&#xff0c;建筑结构健康监测系统对于保障城市建设和建筑的安全具有举足轻重的地位。 WITBEE万宾针对建筑的动态平衡&#xff0c;温湿度&…

shell编程系列(7)-使用wc进行文本统计

文章目录 前言wc命令的使用wc命令的参数说明&#xff1a;统计字数统计行数打印文本行号 结语 前言 统计功能也是我们在shell编程中经常碰到的一个需求&#xff0c;wc命令可以适用于任何需要统计的数据&#xff0c;不只是统计文本&#xff0c;配合ls命令我们可以统计文件的个数…

java gc垃圾回收机制(垃圾收集 Garbage Collection)

一文带你深入JAVA GC&#xff08;垃圾回收机制&#xff09;面试讲解&#xff01;&#xff01;&#xff01; - 知乎 gc常用算法 gc常用算法有&#xff1a;标记-清除算法&#xff0c;标记-压缩算法&#xff0c;复制算法&#xff0c;分代收集算法。 复制算法&#xff08;Java中…

java--子类构造器的特点

1.子类构造器的特点 子类的全部构造器&#xff0c;都会先调用父类的构造器&#xff0c;再执行自己。 2.子类构造器是如何实现调用父类构造器的 ①默认情况下&#xff0c;子类全部构造器的第一行代码都是super()(写不写都有)&#xff0c;它会调用父类的无参数构造器。 ②如果…

【攻防世界-misc】来自银河的信号

1.下载并打开文件&#xff0c;是个音频软件 2.由于打开音频出现的声音类似于无线波&#xff0c;因此需要用RX-SSTV工具打开&#xff0c; RX-SSTV代表“接收图像慢扫描电视”的意思。慢扫描电视是一种通过无线电进行图像传输的技术&#xff0c;通常用于业余无线电领域。RX-SST…

分治法之归并排序

思路: 将待排序数组分成两个子数组&#xff0c;计算中间位置mid。对左半部分进行递归排序&#xff0c;得到一个有序的子数组。对右半部分进行递归排序&#xff0c;得到另一个有序的子数组。合并两个有序的子数组&#xff0c;得到一个完整的有序数组。 示例图: 代码: #include&…

JAVA 算法面试总结

1、二分查找 二分查找又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置 的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c; 则在后半部分循环…

【ONE·Linux || 网络基础(四)】

总言 主要内容&#xff1a;传输层UDP、TCP协议基本介绍。UDP报文格式、TCP报文格式、三次握手四次挥手、TCP可靠性策略说明。 文章目录 总言8、UDP协议&#xff08;传输层一&#xff09;8.1、传输层预备知识8.1.1、端口号8.1.2、一些指令&#xff08;netstat、pidof、xargs&am…

linux 内核工作队列

工作队列&#xff08; work queue&#xff09;是使用内核线程异步执行函数的通用机制。 工作队列是中断处理程序的一种下半部机制&#xff0c;中断处理程序可以把耗时比较长并且可能睡眠的函数交给工作队列执行。 工作队列不完全是中断处理程序的下半部。内核的很多模块需要异步…

android NDK相关,调用C库,JNI,交叉编译,跨平台

首先就是库给我&#xff0c;我先进行开发&#xff08;按照文档&#xff09;&#xff0c;最后进行交叉编译ARM平台。 遇到的问题&#xff1a;我要看到代码效果&#xff0c;所以必须要在真机上跑代码&#xff0c;那么我调用的库就必须是我这个平台适用的&#xff0c;有两种方式&…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…

保存防火墙的规则和自定义链

保存防火墙的规则 将iptables的规则导入开机自启的文件里做脚本使用&#xff0c;就算iptables -F删除&#xff0c;重启就能恢复了 iptables-save #查看当前的所有规则 iptables -save > 保存规则的文件 #保存规则 iptables -restore < 保存的规则文件#重新导入规则 在当…

优维全新低碳产品亮相SBE23 Asia-Pacific绿色建筑促进碳中和论坛

2023年11月23日—24日&#xff0c;由深圳市人民政府主办&#xff0c;深圳市住房和建设局、深圳市发展与改革委员会、深圳市龙岗区人民政府承办&#xff0c;深圳市绿色建筑协会作为执行单位的“2023年可持续建筑环境亚太地区会议&#xff08;SBE23 Asia-Pacific&#xff09;”在…

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接&#xff1a; https://repo.anaconda.com/archive/ 我安装的版本链接如下&#xff1a; https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载&#xff1a; wget …