C语言宏定义(宏参数创建字符串、预处理粘合剂)

        #define CNAME value   或者 #define CNAME expression,常见的常量的定义是这样的,但是宏定义可比想象中的要灵活的多。它可以定义宏常量、宏函数,还可以输入数据类型。然而,宏定义还可以直接将其他类型的数据直接转化成char*类型的字符串,作为预处理的粘合剂使用。

1.宏定义的基本知识

        #define在预处理阶段被展开,众所周知C语言的编译过程中需要4个阶段预处理、编译、汇编、链接这里就不一一说明了,显然define在最初的阶段就会被展开,define没有类型和安全检查。并且define不会被分配内存空间。

2.C语言中预定义的宏(摘要)

        __LINE__:表示当前源代码的行号

        __FILE__:表示当前源文件的名称

        __DATE__:表示文件被编译的日期

        __TIME__:表示文件被编译的时间

        __STDC__:要求程序严格遵循ANSI C标准时该标识符被赋值为1。

        __func__ || __FUNCTION__:表示当前编译的函数名。

#include<stdio.h>

void print(void){
        printf("%d\n",__LINE__);
        printf("%s\n",__FILE__);
        printf("%s\n",__DATE__);
        printf("%s\n",__TIME__);
        printf("%s\n",__func__);
        printf("%s\n",__FUNCTION__);
        printf("%d\n",__STDC__);
}

int main(){
        print();
        return 0;
}

输出结果: 

4
temp.c
Dec 16 2021
19:44:30
print
print
1

 3.宏函数(带参数的宏)

        #define MACRO_NAME(ARGLIST) CONTENT 

        //MACRO_NAME 宏函数名

        //ARGLIST 参数列表,不需要类型,至此可变长(...)

        //CONTENT 替换的语句

        下面给出一个简单例子方便大家理解。

#include<stdio.h>

#define T(type,b) type c = b
#define MAX(a,b) a>b?a:b

int main(){
        T(int,10);
        printf("%d\n",c);
        printf("%d\n",MAX(2,3));
        return 0;
}

输出结果:

10

3

4.用宏参数创建字符串 :#运算

        用#号创建字符串

        define STR(arg) #arg //可以将任何形式的输入转化为字符串

#include<stdio.h>
#define STR(arg) #arg
int main(){
        int x=1;
        printf(STR(1234));
        printf(STR(Hello world!));
        printf(STR(x));
        return 0;
}
~

输出结果:

1234

Hello world!

x                            // 不是1因为他会把x直接当成字符

5.预处理器粘合剂: ##

 变量的粘合,非常有用!!!直接上代码。

#include<stdio.h>

#define CON(a) v__##a
#define PRINT(n) printf("v__"#n"=%d\n",CON(n))
int main(){
        int CON(1) = 1;
        int CON(2) = 2;
        int CON(a) = 3;

        printf("%d\n",v__1);
        printf("%d\n",v__2);
        printf("%d\n",CON(a));
        printf("%d\n",v__a);

        PRINT(1);
        PRINT(2);
        PRINT(a);

        return 0;
}

输出结果:

1
2
3
3
v__1=1
v__2=2
v__a=3

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时而癫狂的匡匡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值