宏定义在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,会发现两个参数重复计算,所以不要使用这类运算


☟☟可点击下方广告支持一下☟☟

最后修改:1970 年 01 月 01 日
请我喝杯可乐,请随意打赏: ☞已打赏列表