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