C语言宏定义拓展


宏定义的浅显理解。

一、宏+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...)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值