C语言宏定义的扩展定义讲解

 更新时间:2022年12月27日 09:50:14   作者:编程远泊  
这篇文章主要介绍了C语言宏定义的扩展,宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译

1. 常量宏定义

使用c中的#define 来定义一个常量来表示一年有多少秒

#define SECONDS_PER_YEAR (606024*365)UL

求圆的周长:

#define D® (r + r) //使用D(5) * 3.14 -----> (5 + 5) * 3.14

2. 定义宏函数

在定义宏函数时,最后一个表达式的结果就是宏函数的返回值

格式:

​ #define 宏函数名(形参表) ({语句1;语句2;语句3…})

​ 形参没有数据类型,只有参数名

请写一个“标准”的宏MIN,这个宏输入两个参数并返回较大较小值
#include <stdio.h>
#define MIN(A,B)  ({A<B?A:B;})
//宏定义分成多行书写,行尾必须加续行符 
#define MAX(A,B)  ({int ret;\
                        if(A<B)\
                            ret=B;\
                        else    \
                            ret=A;\
                        ret;})
int main(int argc, char const *argv[])
{
    int min=MIN(100,200);
    printf("min value=%d\n",min);
    int max=MAX(100,200);
    printf("max value=%d\n",max);
    return 0;
}

3. 宏定义和#号结合

#可以将宏的参数转换为一个字符串

#include <stdio.h>
#define NAME "lisi"
#define NAME1(n)  n
#define NAME2(n)  #n
int main(int argc, char const *argv[])
{
	printf("%s\n",NAME);   //------>printf("%s\n","lisi");
	printf("%s\n",NAME1(lisi));   //------>printf("%s\n",lisi); //error
	printf("%s\n",NAME2(lisi));   //------>printf("%s\n","lisi"); //error
    return 0;
}

预处理之后的效果:

# 5 "test02.c"
int main(int argc, char const *argv[])
{
 printf("%s\n","lisi");
 printf("%s\n",lisi);
 printf("%s\n","lisi");
    return 0;
}

4. 宏定义和两个#结合

两个#可以实现字符串的拼接

// 将a和b代表的字符串拼接生成一个新的字符串
#define  type(a, b)     a##b

type(uint, _t)  ----> 预处理阶段展开之后的结果 : uint_t

练习:int型、short型、char型的数据比较大小

#include <stdio.h>
#if 0
int max_int(int a,int b){
    return a>b?a:b;
}
short max_int(short a,short b){
    return a>b?a:b;
}
char max_int(char a,char b){
    return a>b?a:b;
}
#endif
//使用宏定义完成函数模板
#define MAX(T) T max_##T (T a,T b){return a>b?a:b;}
//使用宏定义,定义max_int max_short max_char函数
MAX(int)
MAX(short)
MAX(char)
#define max_value(T) max_##T
int main(int argc, char const *argv[])
{
    // printf("int max value =%d \n",max_int(10000,300000));
    // printf("short max value =%d \n",max_short(100,300));
    // printf("char max value =%c \n",max_char('a','b'));
    printf("int max value =%d \n",max_value(int)(10000,300000));
    printf("short max value =%d \n",max_value(short)(100,300));
    printf("char max value =%c \n",max_value(char)('a','b'));
    return 0;
}

预处理代码:

int max_int (int a,int b){return a>b?a:b;}
short max_short (short a,short b){return a>b?a:b;}
char max_char (char a,char b){return a>b?a:b;}
int main(int argc, char const *argv[])
{
    printf("int max value =%d \n",max_int(10000,300000));
    printf("short max value =%d \n",max_short(100,300));
    printf("char max value =%c \n",max_char('a','b'));
    return 0;
}

5. 宏定义和do…while()的结合

使用场合:如果在宏定义阶段,有多条语句,最后将c语句用do…while()包裹起来

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PRINT() printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\
              printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
#define DBUG() do{printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);\
              printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);}while(0)
int main(int argc, const char *argv[])
{
    int a=100,b=200;
#if 0
    /*
        调试宏:
        __FILE__:文件名
        __func__:函数名
        __LINE__:当前行号
    */
    // if(a>b){
    //     printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    //     printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    // }else{
    //     printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    //     printf("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    // }
    if(a>b){
        PRINT()
    }else{
        PRINT()
    }
#endif
#if 0
    //如果if或者else只有一条语句,可以省略{}
    //包括while,for循环语句都一样
    if(a>b)
        PRINT()
    else
        PRINT()
    // if和else宏替换后,变成两句,替换后语法错误,解决办法就是使用宏定义和do....while结合
#endif
    // if和else宏替换后,变成两句,替换后语法错误,解决办法就是使用宏定义和do....while结合
    if(a>b)
        DBUG();
    else
        DBUG();
    return 0;
}

6. #ifdef…#else…#endif

格式:

#define 宏定义的名字

#ifdef 宏定义的名字

​ //如果宏定义被定义了,这段代码有效

#else

​ //如果宏定义没被定义,这段代码有效

#endif

7. #ifndef…#else…#endif

格式:

#define 宏定义的名字

#ifndef 宏定义的名字

​ //如果宏定义没被定义了,这段代码有效

#else

​ //如果宏定义被定义,这段代码有效

#endif

8. #if defined() … #else … #endif

----> 底层代码使用较多

格式:
#if defined(宏定义的名字)
	// 如果宏定义被定义了,则这段代码有效
#else
	// 如果宏定义没有被定义,则这段代码有效
#endif 
#if !defined(宏定义的名字)
	// 如果宏定义没有被定义,则这段代码有效
#else
	// 如果宏定义被定义了,则这段代码有效
#endif 
// #if defined可以进行逻辑运算
#if defined(宏定义的名字1) || defined(宏定义的名字2)
	// 以上两个宏定义只要有一个定义了,则这段代码有效
#else
	// 以上两个宏定义都没有定义,则这段代码有效
#endif 
#if defined(宏定义的名字1) && defined(宏定义的名字2)
	// 以上两个宏定义都被定义了,则这段代码有效
#else
	// 以上两个宏定义只要有一个没有定义,则这段代码有效
#endif 

到此这篇关于C语言宏定义的扩展定义讲解的文章就介绍到这了,更多相关C语言宏定义内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 数据结构实现两个栈实现一个队列

    C++ 数据结构实现两个栈实现一个队列

    这篇文章主要介绍了详解C++ 数据结构实现两个栈实现一个队列的相关资料,需要的朋友可以参考下
    2017-03-03
  • C语言二维数组应用之井字棋游戏

    C语言二维数组应用之井字棋游戏

    这篇文章主要为大家详细介绍了C语言二维数组应用之井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++类继承时的构造函数

    C++类继承时的构造函数

    这篇文章主要介绍了C++类继承时的构造函数,C++中,子类继承父类除去构造函数和析构函数以外的所有成员。因此,子类需要编写自己的构造函数和析构函数。更多相关详情需要的小伙伴可以参考下面文章介绍
    2022-03-03
  • C++可以函数重载而C不可以的原因分析

    C++可以函数重载而C不可以的原因分析

    函数重载是指在同一个作用域内,可以定义多个函数,它们具有相同的名称但是参数列表不同,为什么C++可以函数重载而C不可以,接下来就有小编来给大家介绍一下C++可以函数重载而C不可以的原因,需要的朋友可以参考下
    2023-12-12
  • Windows系统下使用C语言编写单线程的文件备份程序

    Windows系统下使用C语言编写单线程的文件备份程序

    这篇文章主要介绍了Windows系统下使用C语言编写单线程的文件备份程序,文中给出了实现的几个关键代码片段,剩下的只要套上main和线程调用的相关函数即可,非常详细,需要的朋友可以参考下
    2016-02-02
  • C++ 虚函数的详解及简单实例

    C++ 虚函数的详解及简单实例

    这篇文章主要介绍了C++ 虚函数的详解及简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • Qt打印信息输出到日志文件中的两种方法

    Qt打印信息输出到日志文件中的两种方法

    最近在研究把 Qt 的打印信息 输出的到日志文件中,文件存储尝试了2种方法,并通过代码示例和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-04-04
  • C语言中的浮点数存储详解

    C语言中的浮点数存储详解

    这篇文章主要介绍了C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C语言猜凶手及类似题目的实现示例

    C语言猜凶手及类似题目的实现示例

    本文主要介绍了C语言猜凶手及类似题目的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++使用map容器实现电子词典

    C++使用map容器实现电子词典

    这篇文章主要为大家详细介绍了C++如何使用map容器实现电子词典功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下
    2022-11-11

最新评论