C语言基础之宏定义(附代码)

C语言基础之宏定义

宏定义:是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。宏定义和操作符的区别是:宏定义是替换,不做计算,也不做表达式求解。#define预处理指令可以用来定义宏。

宏定义的形式,分为带参数和不带参数的宏定义:
1. 不含参数的宏定义:

#define  标识符  字符串

例如: #define PI 3.14
这里的标识符是宏的名称,字符串可以是常数、表达式、格式串。

这里需要注意以下几点:
1)宏名称通常全由大写英文字母构成,里面不能有空格,用宏替换数字的时候不要使用赋值操作符,编译器会把程序中所有宏名称替换成它所代表的数字;
2)宏定义是用宏名来表示一个字符串,在宏展开时,又以该字符串取代宏名,这只是一种简单的代换,字符串中可以是任何字符、常数、表达式,预处理程序不对它作任何检查。如有错误,只能在编译已被宏展开后的的源程序时发现;
3)宏定义不是说明或语句,在行末不需加分号,若加了分号则连分号一起置换。;
4)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令;

  1. 带有参数的宏定义:
#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++语言技术分享使用,欢迎添加交流:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/coding13/article/details/78392093