C语言基础之宏定义(附代码)
2017-10-30 13:30
459 查看
C语言基础之宏定义
宏定义:是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。宏定义和操作符的区别是:宏定义是替换,不做计算,也不做表达式求解。#define预处理指令可以用来定义宏。宏定义的形式,分为带参数和不带参数的宏定义:
1. 不含参数的宏定义:
#define 标识符 字符串
例如: #define PI 3.14
这里的标识符是宏的名称,字符串可以是常数、表达式、格式串。
这里需要注意以下几点:
1)宏名称通常全由大写英文字母构成,里面不能有空格,用宏替换数字的时候不要使用赋值操作符,编译器会把程序中所有宏名称替换成它所代表的数字;
2)宏定义是用宏名来表示一个字符串,在宏展开时,又以该字符串取代宏名,这只是一种简单的代换,字符串中可以是任何字符、常数、表达式,预处理程序不对它作任何检查。如有错误,只能在编译已被宏展开后的的源程序时发现;
3)宏定义不是说明或语句,在行末不需加分号,若加了分号则连分号一起置换。;
4)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令;
带有参数的宏定义:
#define 宏名(参数表) 字符串
例如: #define M(y) y*y+3
它的作用是指定标识符M(y) 来代替表达式y*y+3。在编写源程序时,所有的y*y+3都可以由M(y) 代替。而对源程序作编译时,将先由预处理程序进行宏代换,即用 y*y+3表达式去置换所有的宏名M(y),然后再进行编译。
这里需要注意以下几点:
1)宏的参数不一定代表数字,所以宏参数没有类型,宏可以有多个参数,这个时候需要用逗号把不同参数分隔开, 编译器采用二次替换的方式处理带参数的宏;
2)宏不能使用自己的存储区实现和函数之间的数据传递,宏没有返回值;
3)因为宏没有返回值,所以不能保证优先计算宏内部的操作符,所有能当作数字使用的宏必须写在一对小括号里;
测试代码:
测试结果为:
另外,可以在编译命令中使用 -D 选项指定宏名称代表的数字。
测试代码如下:
测试结果为:
小知识:
#是一个宏操作符,它可以把一个宏的参数转换成字符串字面值;##也是一个宏操作符,它可以把一个代表标识符的宏参数和其他内容连接,得到一个新的标识符。
以下是我的个人公众号,主要作为C/C++语言技术分享使用,欢迎添加交流:
相关文章推荐
- 某新版本不兼容老版本代码的语言的一点基础了解
- 【分享】一些经典的C/C++语言基础算法及代码(三)
- C语言常用宏定义 __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- C语言学习基础代码记录
- c语言基础小程序代码
- 学习java基础语言代码
- C语言基础(1.linux终端命令2.gcc过程3.命令行模式和输入模式切换4.命令行一些命令5.函数(三要素)6.基本的C语言代码结构)
- 【分享】一些经典的C/C++语言基础算法及代码(四)
- 10个经典的ç语言面试基础算法及代码
- Go语言基础学习三-简单的代码分析(并发)
- C语言基础:C语言typedef(2) - typedef与宏定义的对比
- [C语言基础]linux实用代码
- Go语言基础学习二-简单的代码分析
- iOS开发之 Objective-C语言基础 :代码块
- Java学习笔记之语言基础――Java代码安全的概念
- C语言基础练习题及代码2
- C语言基础:C语言宏定义(4) - 多文件编译
- C语言基础知识之(十七):内存的分区:栈区,堆区,静态区(全局区),常量区,代码区
- C语言基础之--宏定义#define与typedef关键字
- C语言基础知识之(八):二维数组,二维字符串数组,代码安全