0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于宏定义的错误理解

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-09-28 16:07 次阅读

宏不是函数如果我们定义一个宏:

#defineMAX(a,b)a>b?a:b

当我们执行一个语句:


3+MAX(1,3);

我们期望的答案应该是6才对,其实呢,运行之后的答案1。与宏定义相挂钩的就是优先级,算数运算符的优先级高于条件运算符,展开如下:

3+1>3?1:3,首先进行算符运算符的运算,即4>3?1:3,所以答案为1。请注意宏定义中的括号,这些括号的作用就是预防引起优先级相关的问题。有些专家建议在

C语言中只要牢记两个优先级就够了,乘除法优先级高于加减法,在设计其它操作符时,一律加上括号。

4、宏定义不是说明或语句,在行末不必加分号

比如,加上分号则连分号也一起置换。

5、宏不是类型定义

首先定义一个宏:

#definepCharchar*

再用pChar 定义两个变量,之后用操作符sizeof读取变量所占用内存大小,如果是指针类型的就占4个字节,如果是字符型的就占1个字节。

poYBAGM0ALSAdLJSAAH0yHnzcoM328.png

结果占用空间不一样,变量类型自然不一样,所以宏定义不是类型定义。那么,如果我换成typedef来定义类型呢?

poYBAGM0AKeAbwHnAAB2JfN4a2w589.png

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明。

6、与之相关的宏定义

编写程序过程中,很多都需要条件编译,来看一个常用的使用方法。

#if defined(CREDIT)

7、总结

宏的本质是代码替换。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124236
  • 宏定义
    +关注

    关注

    0

    文章

    48

    浏览量

    8921
收藏 人收藏

    评论

    相关推荐

    C语言定义技巧

    C语言定义技巧
    发表于 03-01 21:58

    C语言定义中#和##的作用

    本文由dongeasy收集整理,原文链接:http://www.dongeasy.com/software-development/embedded-system/2013.html在定义
    发表于 08-23 18:22

    关于定义

    ;}#define Right_moto_Stop{P0^2=0,P0^3=0;}这样定义为什么会出错,错在哪里?逗号改分号也是错的,试过删除分号,大括号改为小括号,也是错的,希望有人指导下
    发表于 02-14 18:55

    定义问题!

    各位,请问一下,这个定义代表什么意思?#define OUTPUT_WAVE(pointer, d)PORTC = pointer[d*N_PORTS + 0] 谢谢
    发表于 03-12 10:30

    关于定义的问题,涉及##和#

    想通过定义来实现,如下面格式#define link(arg) RCC_APB2Periph_##arg返回的结果为RCC_APB2Periph_GPIOC,以方便在时钟使能函数中使用请教该怎么实现——来自
    发表于 04-20 23:33

    关于汇编代码里的定义

    我用的是F28M35,现在想在汇编里定义一个,我想请教大家怎么将形参和内容中的字符连起来??,应该用什么符号呢 例如: CCSS .MACRO A,             MOV  r0
    发表于 05-14 10:47

    请问FLASH 的定义是如何定义的?为什么?

    ,"ramfuncs");#pragma CODE_SECTION(OffsetISR,"ramfuncs");#endif但是这个FLASH 的定义不知在哪里进行
    发表于 06-11 07:42

    请问STM32头文件里定义名和变量名是不是重复了?

    _PWR 这个条件,这个定义名 PWR和下面的指针变量 PWR一样是同时成立的,是不是把上面的展开后替换下面的PWR呢?变成这样吗? EXT PWR_TypeDef *((PWR_TypeDef *) PWR_BASE);
    发表于 09-04 09:28

    linux错误定义解析

    errno 在中定义错误 Exx 的定义在 /usr/include/asm-generic 文件夹下面的errno-base.h 和 errno.h,分别
    发表于 07-18 07:14

    请问这个#define A (1)定义该怎么理解

    在读程序的过程中遇到了这样的一个定义,求大神解释应该怎么理解?括号不知道该怎么理解.......
    发表于 10-11 01:01

    如何理解定义的这种写法?

    = D)以上3行代码出自国外一芯片驱动代码中第2行与第3行函数中的参数用的是第1行的,但是这个写法不是很理解,这种写法正确不?第2行与第3行函数中的参数 REG_ 就可以表示
    发表于 10-16 00:13

    关于freertos中任务切换定义的疑问谁来解答一下

    下面是摘自freertos关于任务切换的:portYIELD_WITHIN_API();—〉找到定义部分:#define portYIELD_WITHIN_API portYIEL
    发表于 06-12 04:35

    定义理解

    工程目标:实现按键长按,短按,双击,单机调用不同的回调函数,执行不同的命令。定义:#define TRIGGER_CB(event)\if(btn->CallBack_Function
    发表于 01-05 06:58

    C语言定义使用do{}while(0)的好处是什么

    do{}while(0)这种用法呢?主要有两点原因,一个是代码适应性以及拓展性,第二个是为了尽量避免一些不必要的语法和逻辑错误。比如保证你定义的函数能够在形如if...else的语句中保持多重操...
    发表于 02-25 06:28

    怎么去解决结构体指针定义错误的问题呢

    error:expected identifier before ‘(’ token,结构体指针定义错误编译时弹出标题所示错误,一般为
    发表于 02-28 07:22