| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言#define预处理宏定义详细解说 -> 正文阅读 |
|
[C++知识库]C语言#define预处理宏定义详细解说 |
#define介绍:C语言里可以用#define定义一个标识符来表示一个常量。特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了,也不做类型定义。预编译又叫预处理。预编译就是编译前的处理。这个操作是在正式编译之前由系统自动完成的。 #define又称宏定义,标识符为所定义的宏名,简称宏。标识符的命名规则和变量的命名规则是一样的。#define的功能是将标识符定义为其后的常量,一经定义,程序中就可以直接用标识符来表示这个常量,也就是文本替换。变量名表示的是一个变量,但宏名表示的是一个常量,可以给变量赋值,但绝不能给常量赋值。 宏定义最大的好处是方便程序的修改。使用宏定义可以用宏代替一个在程序中经常使用的常量。这样,当需要改变这个常量的值时,就不需要对整个程序一个一个进行修改,只需修改宏定义中的常量就行了。且当常量比较长时,使用宏就可以用较短的有意义的标识符来代替它,这样编程的时候就会更方便,不容易出错。因此,宏定义的优点就是方便和易于维护。 #define宏定义无参的一般形式为:#define? 标识符 常量注意最后没有分号,因为宏不是语句,结尾不用加分号,否则会被替换进进程中。还有一点就是宏名最好用大写字母加下划线组成,以此来区分变量名。 来看一个#define宏定义无参的例子:
#define宏定义有参的一般形式为:#define? 标识符(参数表) 表达式带参数的宏定义,宏名中不能有空格,宏名与形参表之间也不能有空格,而形参表中形参之间可以有空格。 来看一个#define宏定义有参的例子:
我门来稍微改动下代码:
?这里只是把传的参数3被改成了2+1,4被改成了3+1,可能有些朋友会说2+1=3,3+1=4,答案不就和刚才一样嘛。其实不是,因为#define宏定义只是简单的文本替换,那应该被替换成什么呢。SQUARE(2+1)和SQUARE(3+1)分别替换成2+1*2+1和3+1*3+1,?那么最终答案自然是5和7了。那么如何杜绝这个问题呢? 很简单,只要在传参时多加一层小括号:
?如果觉得这样太繁杂,麻烦了,那么直接在宏定义的表达式那里的每个参数都加上小括号:
我们又来稍微改动下代码:
这里在传参数之前加了个除法,那么3*3后是9,再被9除,等于1,4*4后是16,再被16除,等于1,那么预想的最终答案就是1和1了,其实也不是。再来一次文本替换,9/SQUARE(3)和16/SQUARE(4)分别替换成9/(3)*(3)和16/(4)*(4),?那么最终答案自然是9和16了。那么又如何杜绝这个问题呢? 也很简单,只要在传参时多加一层小括号:
如果依然觉得这样太繁杂,麻烦了,那么直接在宏定义的表达式那里的整个表达式都加上小括号:
表达式也可以写多个语句:
#运算符:#运算符的作用就是将#后边的宏参数进行字符串的操作,也就是将#后边的参数两边加上一对双引号使其成为字符串。例如param是一个宏的形参,则替换文本中的#param被系统转化为"param",这个转换过程即为字符串化。如下代码:
##运算符:##运算符也可以用在替换文本中,它的作用起到粘合的作用,即将两个宏参数连接为一个数。如下代码:
可变宏...和__VA_ARGS__:可变宏...和__VA_ARGS__的作用主要是为了方便管理软件中的打印信息。在写代码或DEBUG时通常需要将一些重要参数打印出来,但在软件发行的时候不希望有这些打印,这时就用到可变参数宏了。如下代码:
在宏定义中,形参列表的最后一个参数为省略号...,而__VA_ARGS__被用在替换文本中,来表示省略号...代表了什么。 开发项目中常用的宏定义:防止头文件被重复包含:
得到一个制定地址上的一个字节或字:
求最大值与最小值:?
得到一个结构体中field所占用的字节数:
得到一个field在结构体中的偏移量:
按照LSB格式把两个字节转化为一个word:
按照LSB格式将一个WORD转化为两个字节:
得到一个变量的地址:
得到一个字的高位与低位字节:
?用宏得到一个数组所含的元素个数:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 21:22:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |