对于 #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的使用相关推荐

  1. 非本地类型不能定义方法 cannot define new methods on non-local type time.Duration

    能够随意地为各种类型起名字,是否意味着可以在自己包里为这些类型任意添加方法 ? 参见下面的代码演示 : package mainimport "time"type MyDurati ...

  2. C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define

    C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...

  3. C++ #define(宏定义)的使用

    C++ 宏定义 #define命令是C++语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本. 宏定义的一般形式 #define <宏名& ...

  4. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

  5. const与define相比优点_const与#define的区别、优点

    const与#define的区别 编译器处理方式不同 define宏是在预处理阶段展开. 补充:预处理器根据以#开头的命令,修改原始的程序.比如我们常见的#include 命令告诉处理器读取系统头文件 ...

  6. define的多行定义

    在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 宏定义中允许包含两行以上命 ...

  7. C++中typedef和define的区别

    typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...

  8. c 宏定义用法#define

    转自:https://blog.csdn.net/boring_wednesday/article/details/78756696 宏定义 语法     #define name Stuff #de ...

  9. typedef和define具体的详细区别

    1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错.例如: #define PI 3.141 ...

  10. 深度分析define预处理指令

    #define语句 预处理 宏替换 --以上出自<C语言入门经典(第四版)> #和## --出自<C语言程序设计:现代方法(第2版)> #undef取消定义 --以上出自< ...

最新文章

  1. exfat最佳单元大小_047|仓储物流自动化系统中的物料单元
  2. aswing学习笔记4-通过调用面板中的按钮实现主界面动态切换皮肤的问题!
  3. 设计配色专辑,很值得设计师拥有
  4. struck在c语言中的作用,C语言-选择题及答案.doc
  5. 帆软参数设置_系统参数设置- FineReport帮助文档|报表开发|报表使用|学习教程
  6. EDA与VHDL题目——七人表决器
  7. 可怕的pyspider猫途鹰
  8. 《OpenCV3编程入门》毛星云编著
  9. java robot识别验证码,robotframework处理登录验证码
  10. JavaSE学生教师管理系统
  11. Luogu 3934 Nephren Ruq Insania
  12. Redis连接报错【redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password 】
  13. 计算机视觉面试宝典--目标检测篇(二)
  14. 【MySQL基础】MySQL介绍及安装
  15. spring aop 切面添加日志
  16. Spring Boot @EnableAutoConfiguration解析
  17. LBS-----基站轨迹定位算法
  18. 微信小程序入门--快递查询小程序的制作
  19. shell脚本常见开发工具
  20. HBDDR-123型时间继电器

热门文章

  1. ElasticSearch解决去重精度问题 scripted_metric 去重计数脚本计算高效率解决问题(二)
  2. smar 之YII中的部署 应用
  3. 理解Node类型——不应被忽视的 nodeType、nodeName、nodeValue
  4. 企业云盘哪个最好用?
  5. Stack Overflow 正遭到 ChatGPT 的“暴击”!
  6. (一百七十一) 探索softap和p2p interface优先级
  7. 用乾元通QYT-X1s聚合路由器给视频会议稳定加速
  8. 2019 这一年似乎我不再是了程序员了
  9. 基于AT89C51单片机的无级调光系统的实现
  10. ADB调试USB设备指南