手记

【九月打卡】第19天【养成记】嵌入式挑战第19天,C语言高级进阶:语言宏定义的使用

课程章节:

课程名称:物联网/嵌入式工程师
章节名称:第5周之第四讲 1-1 至 1-2 C语言高级进阶:语言宏定义的使用
讲师姓名:大白老师

课程内容:

C语言高级进阶:语言宏定义的使用

宏定义

简介

格式: #define  宏名     常量
功能:宏名代替常量,做到见名知意

示例用法

#define  MAX  100
说明:
(1)表示MAX这个符号标识的值是100
(2)编译器会将宏替换成宏后面的内容

宏函数

简介

#define 宏函数名(参数1,参数2)  表达式
特点:宏都是原样替换

示例用法

#define M           10
#define CALC(x)   (x * x)

int main()
{
    printf("M = %d\n",M);
    printf("Result = %d\n", CALC(M + M));    
    return 0;
}

分析

可通过-E参数查看编译器的处理方式 : gcc -E xx.c -o xx.i

M = 10
Result = 120

执行结果

示例用法

嵌入式开发常用宏操作 do…while(0)

我们来看一个简单的例子:

void print_demo_first()
{
        printf("demo first\n");
}

void print_demo_second()
{
        printf("demo second\n");
}

void print_demo_third()
{
        printf("demo second\n");
} 

#define   TEST()     printDemo1();printDemo2();

int main()
{
    TEST(); //单独使用无任何副作用;
    return 0;
}

改变代码架构,若是存在if…else语句调用则会出错。
解决方案: s使用do…while语句防止编译出错。
注:宏定义种do…while的while后面不能加;

#include <stdio.h>


void print_demo_first()
{
        printf("demo first\n");
}

void print_demo_second()
{
        printf("demo second\n");
}

void print_demo_third()
{
        printf("demo second\n");
}

//#define  TEST()  print_demo_first();print_demo_second();
#define  TEST()   do{ \
    print_demo_first(); \
    print_demo_second();\
}while(0)

int main()
{
    int n = 0;
    printf("please input a data : ");
    scanf("%d",&n);

    if(n % 2 == 0)
        TEST();        
    else 
        print_demo_third();
    return 0;
}

字符串化运算符#

简介

#我们常称为字符串化运算符,因为它会把宏调用时的实参转换为字符串。

示例:
#define  FUN(x)   printf(#x "= %d\n",x)

FUN(4 + 2)

输出结果:  4 + 2 = 6  

示例用法:

#include <stdio.h>

#define STR(x)  #x

#define NUM 10

int main()
{
    printf("%s\n",STR(3));
    printf("%s\n",STR(NUM));
    return 0;
}

学习笔记:

不定参数宏

简介

C99标准中规定允许用户定义有省略号的宏,省略号必须放在参数列表的后面,以表示可选参数。
你可以用可选参数来调用这类宏。在代码中用...代表。他们被保存到__VA_ARGS__中.

_VA_ARGS__ : 用于在宏替换部分中,表示可变参数列表;

代码示例

#include <stdio.h>

#define LOG(...)   printf(__VA_ARGS__)

#define LOGSTR(fm,...) printf(fm,__VA_ARGS__);

int main()
{
    LOG("This Time is %d o'clock\n",9);
    LOG("This TIme is %d:%d:%d\n",18,12,23);

    LOGSTR("data = %d%s\n",100,"RMB");
    return 0;
}

运行结果

课后任务

练习

写一个宏获取两个数中较大的值。

#define  MAX_VALUE(x,y)   xxx
    
例如:
int a = 10;
int b = 20;
int max;

课程评价:

通过学习语言宏定义的使用,了解到了行业中的编码规范,使编程更具有工程化和语义化。

0人推荐
随时随地看视频
慕课网APP