宏定义在编程里面也有十分重要的作用,下面我就来详细介绍一下:
宏的特点
宏主要特点是它在预编译的时候就会被数字或者代码字符替换掉。这样可以将一些重复的变量替换掉,方便我们进行修改,只需要修改宏定义就行了。
宏的几大类
预定义符号
预定义符号也是在预处理的时候替换掉,主要有以下几个:
这相当于提前用define定义好的宏。我们可以直接使用。
那么都有一些什么作用呢,时间月份文件地方这些就不用说了。我们看看行号有什么用
当发生运行错误的时候我们程序提前退出了但是并不知道具体在哪一行有问题,那么这时的__LINE__就发挥作用了;
define
define是我们比较熟悉的宏定义。
宏定义表达式
如下是宏定义了两个数字和一个加法。
那么结果是否就是121呢?
为什么不是呢?
因为宏定义在预编译的时候就只是替换了符号,再进行计算。我们将替换后的结果看看:
替换后一目了然,先进行了乘法再进行了加法。所以答案是29。
解决办法也很简单,就是在定义宏的时候,提前加上括号保证计算的优先级在不同的宏替换下是一样的
define除了构建这种简单的表达式,还可以干什么呢?我们接着往下看
重复使用的代码
在此之前我们要了解一个东西:
宏的数据传入
类似于函数,我们的宏也可以进行数据的传入,但是不仅可以传数据,也可以传入一个符号。
下面的就是传入数据还有设置一个符号x来当做变量。
我们在写一些for循环的时候,经常会写到for(int x=0;x<len;++x)那么我们是否可以像函数那样用define来宏定义一下呢?
这个我很推荐大家用,很方便,省时间。
定义函数
在讲定义函数的前提下,我们还要知道define的一些语法:
/接行符
我们define只允许一行,如果我们要弄成几行,我们就用/这样我们可以既方便看代码(全写在一行不好看代码逻辑),最后也不会报错。
#将变量变成字符
##将两个字符连接到一起
这个我同上面结合一起讲
比如我们要定义一个可以自己选择的打印函数,一个值是变量,另一个是打印的类型.
#undef
用来取消一个宏定义,这一行之后就不能再用被取消的宏了。
条件宏
#ifdef - #endif
补全单词就是if define end if,表示如果定义了什么就会执行下面的代码,然后在end if之前终止
#if 常量表达式 -#elif - #else - #endf
这个和我们的if - else if -else是一样的,而且支持嵌套条件宏。
而且也可以拆解:#if - #endif 或者 #if - #else - #endif #if - #elif - #endif 都是可以的
我们发现不会执行的代码会变浅,这种也是可以当注释用的,而且似乎比注释成绿色的更好看的清。这里如果是不用了的代码就可以用绿色注释法,如果可能后面还要用就用井号注释法
头文件的包含
<>和""
头文件的包含也是宏定义的一种。其中头文件的包含包括两种,一种是""另一种是<>。那么他们有什么不同呢?
<>是直接在标准库里面找头文件,而""是先在外部文件里面找你写的头文件,如果没找到再标准库里面找头文件。
因此我们如果是引用标准库的文件用<>最好,防止用""查找两次。
头文件的嵌套包含
头文件的嵌套包含是有问题的,可能同一段代码出现了两次,可能导致变量的重定义。因此我们有两种方法来避免这种情况的发生。
第一种是:
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif
第二种是:
#pragma once 推荐第二种
命名约定
我们定义宏一般全部大写,定义函数的时候小写居多。这样方便区分。