宏定义在C语言中很常见,现在就总结下宏定义的相关知识以作记录。
一、宏定义
1、宏定义就是 #define 名字 替换文本。
替换文本是#define尾部的所有文本,可以是一句表达,也可以是几句表达,多句表达如果换行要加上斜杠\,比如说这样
#define ss printf("hu");\ printf("dong");\ printf("dong")
这样如果执行ss;就会有三个输出。
2、可以使用#undef取消宏定义,继续上句,使用#undef之后,就可以把ss取消宏定义当成变量赋值了。
ss; //宏定义输出 #undef ss //取消宏定义 int ss=10; //ss变为变量赋值
3、参数不能使用带引号的字符串替换,但是可以使用#来作为前缀,将会把实际参数替换成该参数的带引号的字符串
#define drops(expr) printf(#expr" = 2",expr);
如果输出 drops(1);
实际上是替换成了printf("1" "=2");
所以最后输出的是1=2.
4、可以使用##来连接参数,如果替换文本中的参数和##是连着的,那么这两个参数就会被连接
#include <stdio.h> #define pas(front,back) front##back int main(int argc, const char * argv[]) { printf("%d",pas(1, 2)); return 0; }
输出之后就是12。
二、条件包含
宏定义可以使用这种格式来实现条件包含
#if 10==10 printf("1"); printf("1"); #elif 10==20 printf("2"); printf("2"); #elif 10==30 printf("3"); printf("4"); #else printf("5"); printf("6"); #endif
条件成立之后会执行后面的各行,直到遇到#elif、#else、#endif位置,所以不需要加括号。
也可以使用#if defined(名字),这个是判断名字是否已经定义,如果定义为1,否则为0。
更多可以参考这个文章:《通过预编译实现不同的编译条件》
三、注意
1.宏定义,参数变量要加括号,比如说
#define max(A,B) ((A) > (B) ? (A) : (B))
只有这样碰到max(p+q,r+s);这类的才会替换成
((p+q) > (r+s) ? (p+q) : (r+s));
2.宏定义时变量不要使用自增自减这类运算
比如这样
max(i++,j++);
这样输出参数i,j,会发现两个参数重复计算,所以不要使用这类运算
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/230.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!