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

    文章

    7608

    浏览量

    137200
  • 宏定义
    +关注

    关注

    0

    文章

    51

    浏览量

    9037
收藏 人收藏

    评论

    相关推荐

    C语言定义使用技巧

    写好C语言,漂亮的定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用的
    发表于 07-29 09:35 1121次阅读

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

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

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

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

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

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

    定义理解

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

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

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

    C语言定义使用技巧

    写好C语言,漂亮的定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得
    发表于 11-13 12:04 36次下载

    内联函数和定义的区别介绍

    定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:定义、文件包含、条件编译。定义
    发表于 12-15 15:33 2344次阅读
    内联函数和<b class='flag-5'>宏</b><b class='flag-5'>定义</b>的区别介绍

    不带参数的定义是什么?不带参数的定义的资料介绍详细过程概述

    c语言中有一个定义,其中有一类就是不带参数的定义定义是C提供的三种预处理功能的其中一
    发表于 09-04 15:38 5次下载

    如何理解CMSIS-RTOS API和定义

    定义中的 instances 表示基于此任务参数,创建出几个任务实例,比如instances为2,则会创建出两个任务。
    的头像 发表于 08-26 11:54 2638次阅读
    如何<b class='flag-5'>理解</b>CMSIS-RTOS API和<b class='flag-5'>宏</b><b class='flag-5'>定义</b>

    对于定义与重复定义的问题

    对于定义与重复定义的问题
    发表于 11-29 18:21 1次下载
    对于<b class='flag-5'>宏</b><b class='flag-5'>定义</b>与重复<b class='flag-5'>定义</b>的问题

    C语言基础:定义使用do{}while(0)的好处

    推荐用do{}while(0)这种用法呢?主要有两点原因,一个是代码适应性以及拓展性,第二个是为了尽量避免一些不必要的语法和逻辑错误。比如保证你定义的函数能够在形如if...else的语句中保持多重操...
    发表于 01-13 13:06 2次下载
    C语言基础:<b class='flag-5'>宏</b><b class='flag-5'>定义</b>使用do{}while(0)的好处

    error:expected identifier before ‘(‘ token,结构体指针定义错误

    error:expected identifier before ‘(’ token,结构体指针定义错误编译时弹出标题所示错误,一般为
    发表于 01-13 15:42 11次下载
    error:expected identifier before ‘(‘ token,结构体指针<b class='flag-5'>宏</b><b class='flag-5'>定义</b><b class='flag-5'>错误</b>

    C语言中的定义

    #define命令是C语言中的一个定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为名,被定义的字符串称为替换文本。命令有两种
    的头像 发表于 09-28 16:05 3480次阅读
    C语言中的<b class='flag-5'>宏</b><b class='flag-5'>定义</b>

    c语言带参数的定义

    c语言带参数的定义  C语言定义是一种替换机制,它可以将一个标识符替换为一个代码片段。
    的头像 发表于 09-04 17:45 2453次阅读