宏不是函数如果我们定义一个宏:
#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个字节。

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

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明。
6、与之相关的宏定义
编写程序过程中,很多都需要条件编译,来看一个常用的使用方法。
#if defined(CREDIT)
7、总结
宏的本质是代码替换。
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
C语言
+关注
关注
183文章
7646浏览量
146174 -
宏定义
+关注
关注
0文章
51浏览量
9453
发布评论请先 登录
相关推荐
热点推荐
有关于宏定义的问题,涉及##和#
想通过宏定义来实现,如下面格式#define link(arg) RCC_APB2Periph_##arg返回的结果为RCC_APB2Periph_GPIOC,以方便在时钟使能函数中使用请教该怎么实现——来自宏
发表于 04-20 23:33
如何理解宏定义的这种写法?
= 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提供的三种预处理功能的其中一
发表于 09-04 15:38
•5次下载
C语言基础:宏定义使用do{}while(0)的好处
推荐用do{}while(0)这种用法呢?主要有两点原因,一个是代码适应性以及拓展性,第二个是为了尽量避免一些不必要的语法和逻辑错误。比如保证你宏定义的函数能够在形如if...else的语句中保持多重操...
发表于 01-13 13:06
•2次下载
error:expected identifier before ‘(‘ token,结构体指针宏定义错误
error:expected identifier before ‘(’ token,结构体指针宏定义错误编译时弹出标题所示错误,一般为宏
发表于 01-13 15:42
•11次下载
关于宏定义的错误理解
评论