课程章节:
课程名称:物联网/嵌入式工程师
章节名称:第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;
课程评价:
通过学习语言宏定义的使用,了解到了行业中的编码规范,使编程更具有工程化和语义化。