关于#define的使用
对于 #define的认识,昨天还停留在大学老师C语言课堂上的讲解,如下:
define作用:
在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串来替换。
分为两类:
1.无参宏定义
无参宏的宏名后不带参数。
其定义的一般形式为:
#define 标识符 字符串
#define M (x*y)//用M代表x*y
2.带参宏定义
带参宏定义一般形式:
- #define 宏名(形参表)字符串
#define MAX(a,b) (a>b)?a:b//用宏名MAX表示条件表达式(a>b)?a:b
今天在看学习源代码的时候,看到下列相关使用:
代码来源:https://github.com/chenshuo/4.4BSD-Lite2
代码一:
#define IF_PREPEND(ifq, m) { \(m)->m_nextpkt = (ifq)->ifq_head; \if ((ifq)->ifq_tail == 0) \(ifq)->ifq_tail = (m); \(ifq)->ifq_head = (m); \(ifq)->ifq_len++; \
}
代码二:
#ifdef vax
void ifubareset __P((int));
#endif
代码三:
#if (defined(sun) || defined(ibm032)) && !defined(__GNUC__)
#define BIOCGBLEN _IOR(B,102, u_int)
#define BIOCSBLEN _IOWR(B,102, u_int)
#define BIOCSETF _IOW(B,103, struct bpf_program)
#else
#define BIOCGBLEN _IOR('A',102, u_int)
#define BIOCSBLEN _IOWR('A',102, u_int)
#define BIOCSETF _IOW('A',103, struct bpf_program)
#endif
看到以上几个用法有点懵,大学里根本没讲
不过也习惯了
经过查阅相关资料
代码一的意义:
定义一个多行宏,每行结尾一定要加 \
相当于使用这个宏(IF_PREPEND(ifq, m))替换这个代码块
代码二、三的意义:
都是条件编译,只关心宏是否被定义,不关心宏逻辑的真假。
那么#ifdef、#if defined有什么区别?
进一步探索发现
宏常用的条件编译有三种:#if、#ifdef、#if defined
区别:
#if关心宏逻辑的真假
#ifdef适用于较简单的预编译条件
#if defined常组成较复杂的编译条件
代码示例
#define FLAG1 0
#define FLAG2 10
// 第一段条件编译
#if FLAG1逻辑1
#else逻辑2
#endif
// 第二段条件编译
#ifdef FLAG1逻辑1
#else逻辑2
#endif
// 第三段条件编译
#if (defined(FLAG1) || defined(FLAG2)) && !defined(FLAG3)逻辑1
#else逻辑2
#endif
上面代码第一段会执行逻辑2(判断宏的逻辑真假),第二、第三段会执行逻辑1
关于#define的使用相关推荐
- 非本地类型不能定义方法 cannot define new methods on non-local type time.Duration
能够随意地为各种类型起名字,是否意味着可以在自己包里为这些类型任意添加方法 ? 参见下面的代码演示 : package mainimport "time"type MyDurati ...
- C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define
C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...
- C++ #define(宏定义)的使用
C++ 宏定义 #define命令是C++语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 宏定义的一般形式 #define <宏名& ...
- C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...
- const与define相比优点_const与#define的区别、优点
const与#define的区别 编译器处理方式不同 define宏是在预处理阶段展开. 补充:预处理器根据以#开头的命令,修改原始的程序.比如我们常见的#include 命令告诉处理器读取系统头文件 ...
- define的多行定义
在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 宏定义中允许包含两行以上命 ...
- C++中typedef和define的区别
typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...
- c 宏定义用法#define
转自:https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法 #define name Stuff #de ...
- typedef和define具体的详细区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如: #define PI 3.141 ...
- 深度分析define预处理指令
#define语句 预处理 宏替换 --以上出自<C语言入门经典(第四版)> #和## --出自<C语言程序设计:现代方法(第2版)> #undef取消定义 --以上出自< ...
最新文章
- exfat最佳单元大小_047|仓储物流自动化系统中的物料单元
- aswing学习笔记4-通过调用面板中的按钮实现主界面动态切换皮肤的问题!
- 设计配色专辑,很值得设计师拥有
- struck在c语言中的作用,C语言-选择题及答案.doc
- 帆软参数设置_系统参数设置- FineReport帮助文档|报表开发|报表使用|学习教程
- EDA与VHDL题目——七人表决器
- 可怕的pyspider猫途鹰
- 《OpenCV3编程入门》毛星云编著
- java robot识别验证码,robotframework处理登录验证码
- JavaSE学生教师管理系统
- Luogu 3934 Nephren Ruq Insania
- Redis连接报错【redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password 】
- 计算机视觉面试宝典--目标检测篇(二)
- 【MySQL基础】MySQL介绍及安装
- spring aop 切面添加日志
- Spring Boot @EnableAutoConfiguration解析
- LBS-----基站轨迹定位算法
- 微信小程序入门--快递查询小程序的制作
- shell脚本常见开发工具
- HBDDR-123型时间继电器
热门文章
- ElasticSearch解决去重精度问题 scripted_metric 去重计数脚本计算高效率解决问题(二)
- smar 之YII中的部署 应用
- 理解Node类型——不应被忽视的 nodeType、nodeName、nodeValue
- 企业云盘哪个最好用?
- Stack Overflow 正遭到 ChatGPT 的“暴击”!
- (一百七十一) 探索softap和p2p interface优先级
- 用乾元通QYT-X1s聚合路由器给视频会议稳定加速
- 2019 这一年似乎我不再是了程序员了
- 基于AT89C51单片机的无级调光系统的实现
- ADB调试USB设备指南