宏定义的浅显理解。
一、宏+C语句
参数宏编译可以完成一些简单的逻辑控制,其具体形式如下:
#define TEXT(a) if(a) printf("yes!");\
else printf("no~");
void main(void)
{
TEXT(1);
}
其中反斜杠在C中表示换行符,其后不可添加任何字符,空格也不允许。
这样的宏定义有点像一个小函数,其中TEXT接收一个值,这个值会被后面的条件语句判断和执行,所得结果为
yes
二、条件宏编译
#ifndef _BSP_LED_
#define _BSP_LED_
#endif
这样的条件宏编译可以保证代码不复用。
三、在调试中的作用
1.预制宏
在C语言中已经内置好了一些宏,这些宏用于打印可以用于调试程序。这些宏在使用时都要用 双引号 ("")括起来才可生效,(为了和 printf
中的字符区别开来。
其中 \_\_LINE__
不可直接在双引号中使用,需要用作为 printf
的参数传入。这时就不需要双引号区别了。
宏 | 描述 |
---|---|
__DATE__ | 显示当前日期 |
__TIME__ | 显示当前时间 |
__FILE__ | 显示代码所在文件 |
__LINE__ | 显示代码行 |
#define DEBUG printf(" "__DATE__" \n\
"__TIME__" \n\
"__FILE__" \n\
%d ",__LINE__)
void main()
{
DEBUG;
}
结果:
Jul 19 2020
20:35:52
d:\VScode\VS-Code-C\text.c
9
2.带参宏
宏中可以带上参数,注意带参宏的参数在使用时需要用双引号和 printf
中的字符区别开来。
#define DEBUG(x,y) printf(" "x " "y"" )
int main(int argc, char **argv) {
DEBUG("My name is","XYZ");
return 0;
}
3.可变参数列表(有内味了
#define DEBUG(x,arg...) printf(""x"",##arg)
int main(int argc, char **argv) {
DEBUG("My name is %s","XYZ");
return 0;
}
x 为宏的参数,在调用时必须填入。而 arg… 为可变参数,可以传入任意多个(可以不填)。因为可变参数的存在,printf
的参数表中要有 ##arg
。
因为可变参数的存在,调用这个宏时,x 可以代入一些可变参数,而 arg… 位置传入的参数将会填入这些可变参数中。
如本程序中,对 x 传入了一些字符串,其中有可变参量 %s
; 这个可变参数的值由后面的字符串给出。
得到结果:
My name is XYZ
可变参数可以传入多个,非常amazing;
#define DEBUG(x,arg...) printf(""x"",##arg)
int main(int argc, char **argv) {
DEBUG("My name is %s %s %s","XYZ",",King"," of the universe.");
return 0;
}
得到结果
My name is XYZ,King of the universe.
4.调试中的应用
把条件宏编译,带参宏 和预制宏结合在一起就有不一般的风味。
先看这样一段代码:
#define DEBUG(format) printf(" "__FILE__" --- %d",format)
void main()
{
DEBUG(666);
}
结果:
d:\VScode\VS-Code-C\text.c --- 666
通过这个宏我们可以打印出代码所在文件名称,并在其后添加想一并打印出的附带语句。但是,仍有不满意,这里附带语句只能是数字,而且只能传入一个。我们想要想随意打印,不限于一句话,固定的数据样式。
通过可变参数列表可以解决这个问题。
#define DEBUG(format,arg...) printf(" "__FILE__" "format" ",##arg)
void main()
{
DEBUG("--- 666 --- %s","Dangerous!");
}
结果:
d:\VScode\VS-Code-C\text.c --- 666 --- Dangerous!
这样就可以完成随意打印的需求,而且可变参数的引入,使得打印信息可以更多,更实时。
这些调试信息可能在产品开发时需要用到,但开发完后给客户的产品不需要这些调试信息。把调试信息一条条删去太麻烦,可以采用条件宏编译,在完成开发后修改宏,简单快速完成调试信息的去除。
#define _DEBUG_
#ifdef _DEBUG_
#define DEBUG(format,arg...) printf(" File:"__FILE__" --- \
Line:%d --- "format"\n ",__LINE__,##arg)
#else
#define DEBUG(format,arg...)