C语言:宏级详细
目录
一、用宏前须知-#define相关知识
大致结构:
-
-
-
自定义名 内容
栗子:
-
-
-
-
-
-
-
-
int main()
-
{
-
printf("%d \n", OP);
-
printf("%s \n",YU);
-
printf("%d \n", S(6));
-
PRINT;
-
return 0;
-
}
对预定义符号的补充:
-
__FILE__ //进行编译的源文件
-
__LINE__ //文件当前的行号
-
__DATE__ //文件被编译的日期
-
__TIME__ //文件被编译的时间
-
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义
二、用#define定义宏
什么是宏?
宏可以看作为一些命令的集合。它是一种预处理器指令,在预编译阶段将宏名替换为后面的替换体。
而#define可以用来定义宏:
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。
宏的声明方式:
-
-
//其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
栗子:
实现一个开平方的宏
-
-
-
printf("%d \n", SQ(7));
他的实际执行结构为7*7->即为49
还是用这个我们刚刚定义的宏
我们执行下面这段代码:
-
int a=6;
-
-
printf("%d \n", SQ(6 1));
他的实际执行结构为6 1*6 1->即为13
这说明了什么?这印证了上面所说的宏是把参数替换到文本中,也就是宏直接吧6 1替换掉了x直接带入了后面的表达式当中了!
对此,根据我们原来的用意。这时我们可以用括号来解决这个问题:
#define SQ(x) (x)*(x)
这给了我们一个提醒:我们在用宏时最好多用括号,以此来避免不必要的错误!
再看个栗子:
-
#define DOUBLE(x) (x) (x)
-
int a = 5;
-
printf("%d\n" ,10 * DOUBLE(a));
在这个例子中我们对这个宏使用了括号,乍一看这个例子输出的值像是100
但是实际呢?上图!
来看看实际它怎么执行的,它执行替换操作实际上为:
printf ("%d\n",10 * (5) (5));
因此我们说定义宏要多用括号!
#define DOUBLE( x) ( ( x ) ( x ) )
改成这样就能实现想要的效果啦!
#define的替换规则:
三、常用的宏定义
1、宏定义常量
定义诸如:字符串、整形数、浮点型数等等的常量.
栗子:
-
-
-
-
-
int main()
-
{
-
printf("%d %s %f", AO, NTR, KK);
-
return 0;
-
}
2、定义一个宏语句
栗子:
-
-
-
int main()
-
{
-
PFINT///预处理时会被替换为 printf("hello world!\n");
-
return 0;
-
}
3、宏定义函数
宏可以接受参数,类似于真正的函数一样。具体的接受参数方法与函数差不多,只不过不用指定函数类型,这也是宏定义函数的一个优势!比如:当我定义了一个函数有时要传整形,有时要传浮点型,函数可能要根据类型来多定义几个,而宏只需要一个就行了!
栗子1:
-
-
-
-
int main()
-
{
-
printf("%d", MAX(114, 514));
-
return 0;
-
}
栗子2:
-
#define MALLOC(num, type)\
-
(type *)malloc(num * sizeof(type)) //这和\是干啥的?详见地四大点\的作用
-
...
-
//使用
-
MALLOC(10, int);//类型作为参数
-
//预处理器替换之后:
-
(int *)malloc(10 * sizeof(int));
这个例子中,函数是做不到跟宏相同的效果的,所以说为啥有了函数我们还要定义宏呢?这个就是一个很明显的例子。
宏与函数的对比:
4、#和## 分别字符串化和将两个符号连接成一个符号
#字符串化
这个很好理解看看例子就会了!
栗子:
-
#define STR(exp) printf("%s\n",#exp);
-
#include<stdio.h>
-
int main()
-
{
-
STR(for fun)
-
return 0;
-
}
##将两个符号连接成一个符号
##可以把位于它两边的符号合成一个符号。 它允许宏定义从分离的文本片段创建标识符。
栗子:
-
#include<stdio.h>
-
#define ADD_TO(num, value) num##value
-
-
-
int main()
-
{
-
int a = ADD_TO(114, 514);
-
printf("%d \n", a);
-
return 0;
-
}
四、与宏相关的作用符号
1、换行符 '\'
在每行末尾(除了最后一行)加上"\",代表换行的意思。这个目的是为了不让代码冗余,如果代码都挤在一段,代码就不美观,可读性不好。
栗子:
-
#include<stdio.h>
-
#define PFINT printf("hello world!\n");\
-
printf("goodbye world!\n");
-
#define NUM 1,\
-
2,\
-
3
-
int main()
-
{
-
PFINT
-
int x[] = { NUM };//->int x[] = { 1,2,3 };
-
printf("%d %d %d \n", x[0], x[1], x[2]);
-
return 0;
-
}
2、取消宏定义#undef
这条指令用于移除一个宏定义。
在#undef之后SORT就相当于没有定义,失效了。再使用则会报错!
五、命名约定
细心的朋友可能发现了!我在定义宏时用的都是大写的字母来作为它自定义的名字!
这是因为这有一个默认的命名约定:
一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。
那我们平时的一个习惯是:
把宏名全部大写
函数名不要全部大写
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggggcc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13