define定义的函数如何引用_「C与指针心得」25.预处理器-宏函数

本文详细讲解了C语言中的预处理器宏定义,包括常量定义、宏判断的使用实例,以及宏函数的实现及其潜在问题。通过宏,我们可以实现条件代码执行和简洁的代码复用,但要注意避免宏副作用,如参数未括号展开导致的问题。
摘要由CSDN通过智能技术生成

感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章

上一节讲了一些系统的预定义宏,这一节来讲一讲 宏定义、宏函数。

预处理常量 define:

预处理器指令从#开始,到最后第一个换行符为止。如果在结尾出现反斜杠,则定义会自动延续到下一行。

/*define定义一个常量MAX_VALUE*/#define MAX_VALUE 10/*define结尾出现反斜杠,定义自动延续到下一行*/#define PARAGRAPH “This is the first exampleof define "printf(“max value is %d”,MAX_VALUE);printf(“paragraph is %s”,PARAGRAPH);

每个define行有三部分组成。

  • 第一部分为#define本身;
  • 第二部分为所选择的缩略语,成为宏,宏的名字中不允许有空格,我们约定使用大写表示。
  • *第三部分为宏替换的文本,成为宏展开。如果没有替换文本,我们成为一个基本宏定义。

宏判断:

如果我们想一些段落代码,只在部分宏有定义的情况下才只用,我们这里会用到宏判断。

格式:

#ifdef XXX...#else...#endif

例:

#define PROJECT_TESTint main(void){ #ifdef PROJECT_TEST printf(“marco PROJECT_TEST is defined”); #else printf(“marco PROJECT_TEST not defined”); #endif return 0;}

如果我们在工程中定义了PROJECT_TEST这个宏,则打印第一段,否则打印第二段。

宏函数:

宏函数,即用宏的方式来实现函数。宏函数末尾不能带分号做结尾。宏函数中的参数都需要用括号扩起来。

例如:

#define SEQUERE(a) a*aint seq_value;int a = 4;seq_value = SEQUERE(a);printf(“seq_value = %d”,seq_value);

输出:16

但是这种写法有个问题,如果我们传入的a为 a+1时,就会发生问题

int seq_value;int a = 4;seq_value = SEQUERE(a+1);printf(“seq_value = %d”,seq_value);
输出: 9输出的内容为9,而不是我们期望的25.我们简化一下这个程序SEQUERE(a) aa变为a+1a+1a为4,所以结果为4+1*4+1 = 9.

为了避免这种情况,我们在宏函数中的每个参数都需要用小括号()括起来。

即为#define SEQUERE(a) (a)*(a)

e57a10eab34597dfc5d92b42cc63ffde.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值