适用场景 如果 函数执行时间 小于 函数调用(参数压栈,栈帧开辟与回收,结果返回),那使用宏或者inline能减少函数执行时间。...宏定义与inline函数异同 异:宏定义就是字符替换,不做类型检查;inline反之,相当于不用执行函数调用直接执行函数体。 同:宏和Inline函数的展开发生在预处理阶段。...预处理:简言之,将头文件,宏,inline函数展开,生成.i文件。 inline函数与成员函数 编译器可能会将 类中声明并定义的成员函数 自动转化为内联函数。...参考 待 inline构造函数 与 参数列表 比较
C++宏定义 学过C语言的读者,对宏定义应该不陌生,同样在C++中,也可以用宏定义命令将一个指定的标识符来代表一个字符串,宏定义的作用一般是用一个短的名字代表一个长的字符串。...字符串 比如,定义宏正方形面积Area: #define Area(long,wide) long*wide 看完之前的推文的读者,应该知道C++中增加了内置函数,比用带参数的宏定义更方便,因此在C++...中基本上已不再用#define 命令定义宏了,宏定义主要用于条件编译中。...经典案例:C++宏定义求面积,要求可以手动输入长和宽。...C++宏定义求面积 更多案例可以go公众号:C语言入门到精通
一、#define的基本语法 在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。...然而,在这个特定的MAX宏定义中,每个参数只出现一次,在条件运算符的左侧用于比较,在右侧用于作为结果返回。因此,每个参数只会被递增一次。...但是对于宏,不能出现递归。 2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。 七、宏与函数的对比 宏通常被应用于执行简单的运算。...用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。 2. 更为重要的是函数的参数必须声明为特定的类型。...所以函数只能在类型合适的表达式上使用。反之,这个宏怎可以适用于整形、长整型、浮点型等可以用于 > 来比较的类型。宏是类型无关的。 和函数相比宏的劣势: 1.
不带参数的宏的定义方式如下(这也是我们经常用到的宏定义) #define 宏名 字符串 //没有分号,说没有分号倒不如说最好不要加分号 这里说下原因吧:因为宏定义它并不是C语言的语句,所以不用加分号...在使用函数的时候我们需要注意它的数据类型,但是在宏当中我们是不需要注意的,想是整形就是整形想是浮点型就是浮点型。说明用宏在这里是更加灵活的只是处理简单问题上切记。...命名事项 相信有些小伙伴已经发现了这个函数的宏的使用语法和函数是非常类似滴。所以语言本身就会没办法帮我们区分二者的一些使用。...那么我们平时写宏或者函数的时候的习惯是↓ 宏明全部大写形式。 函数明不要全部大写,建议第一个字母大写。...✔拓展⇢用do...while(0)语句结构可以在宏插入多条语句的结构因为有花括号{}在。 #undef #undef 是为取消定义,用于移除一个宏的定义。
前面,我们既一起研究了自定义函数的题,有看了宏定义的题,下面这题刚好就是要用自定义函数和宏定义解题的,帮大家巩固知识点 题目描述 分别用函数和带参的宏,从三个数中找出最大的数。...输入 3个实数 输出 最大的数,输出两遍,先用函数,再用宏。 保留3位小数。...样例输入 1 2 3 样例输出 3.000 3.000 大家会发现宏定义比自定义函数简单,方便,但自定义函数的功能更加强大 PS:宏定义只是简单的宏替换 详细题解见C语言网题库1041题 比赛也打完了,...另外,有兴趣的同学还可以加入C语言网官方微信群,一起讨论C语言 通过加小编:dotcppcom 备注:C语言网昵称(需要先在C语言网注册哦) 就让我们 向着更加美好的明天 加油!加油!加油!
__); // 5 #line 100 printf("Line: %d\n", __LINE__); // 100 return 0; } 【注】__FILE__ 和 __LINE__ 宏主要用于错误处理...C99 引入了 __func__,它和 GCC 提供的 __FUNCTION__ 功能类似,二者都是字符串格式,指示当前处理的函数名。...__OBJC__:当使用了 Objective-C 编译器时,该宏被定义。因此可以它来测试编译时使用的编译器是 C 编译器还是 Objective-C 编译器。...__ASSEMBLER__:当预处理汇编语言时,该宏被定义。 2. 公共内置宏定义 公共内置宏定义是 GNU C 的扩展,只要使用了 GNU C 或者 GNU Fortran,这些宏都是可使用的。...内置操作符宏定义 C++ 定义了 11 个操作符宏,如下表所示: 操作符 操作符宏 && and &= and_eq & bitand | bitor ~ compl ! not !
ANSI标准说明了五个预定义的宏名。...需要注意的是凡宏定义里有用"#"或"##"的地方宏参数是不会再展开....char buf[sizeof "0x7fffffff"]; 这里相当于: char buf[11]; ========================================== C宏定义的技巧总结...A N S I标准说明了五个预定义的宏名。...记住编译程序 也许还提供其它预定义的宏名。 _ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。
C语言宏定义详解 在C语言中,宏定义是一种强大的预处理器功能,用于在编译之前对代码进行替换和条件编译。宏定义通过预处理器指令进行定义和使用,能够使代码更加灵活和可维护。...本文将对C语言中的宏定义进行全面的讲解,包括各种相关的预处理器指令及其用法。 1. 宏定义关键词总览 关键词 用途 #define 定义宏(常量宏或函数宏)。...#define #define 指令用于定义宏,可以是常量宏或函数宏。常量宏用于定义常量值,而函数宏用于定义带参数的代码片段。...#ifdef #ifdef 指令用于检查某个宏是否已定义。如果宏已定义,则编译相关的代码块。...总结 C语言中的宏定义是一种强大的预处理器功能,用于在编译之前对代码进行替换和条件编译。
C语言宏定义技巧(常用宏定义) 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用得宏定义。...记住编译程序 也许还提供其它预定义的宏名。 _ LINE _及_ FILE _宏指令在有关# line的部分中已讨论,这里讨论其余的宏名。...可以定义宏,例如: 当定义了_DEBUG,输出数据信息和所在文件所在行 #ifdef _DEBUG #define DEBUGMSG(msg,date) printf(msg);printf(“%d...%d%d”,date,_LINE_,_FILE_) #else #define DEBUGMSG(msg,date) #endif 20、宏定义防止使用是错误 用小括号包含。...需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1、非'#'和'##'的情况 #define TOW (2) #define MUL(a,b) (a*b) printf
前两天上课,被JAVA老师问懵了,老师问:“你们学C语言,有没有写过带参的宏玩一玩”,说实话,我根本没听过什么带参的宏,我只用过宏定义,所以我下来一定要找个时间把这“带参的宏搞懂”,于是就有了这篇文章...C语言中宏定义分两种,无参的宏和有参的宏 1.无参数的宏 无参数宏定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值... cout<<a<<" "<<b<<endl;//3 5 coutc<<" "<<d;//5 3 return 0; } 你会发现函数,并没有交换实参...,而宏交换了,但是如果把函数中的参数改为指针或者引用就能成功交换了。...参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。 5. 函数只在目标文件中存在一处,比较节省程序空间。 6.
用内联取代宏: 1.内联函数在运行时可调试,而宏定义不可以; 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,...宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。 ...文章(一) 内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如: #define MAX(a,b) ((a)>(b)?...a:b; } 1.内联函数与宏的区别: 传统的宏定义函数可能会引起一些麻烦。 ...所以在C++ 程序中,应该用内联函数取代所有宏代码,“断言assert”恐怕是唯一的例外。assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。
最近做某项目撸代码时用到了offsetof宏,第一次使用这个宏,项目结束后对其用法也略知一二,现分享如下。...位于stddef.h中的offsetof()宏,是获得struct中某成员相对于struct首地址的偏移量,以byte为单位,用struct首地址加该偏移量获得该成员的实际地址时,要把struct首地址强制转换成以...*(u16 *)((u16 *)((u8 *)&ScrPara+s32)+c8)=i8; 用一个成员的实际地址去计算另一成员的实际地址时也要注意对第一个成员实际地址的计数单位的强制转换,此处是根据成员的...*(u16 *)((u16 *)((u8*)&ScrPara+s32)+c8)=i8; 以上各种地址,操作其内放的值时也要对地址进行一次计强制转换,该强制转换是与其内放的值的size相同。...*(u16 *)((u16 *)((u8*)&ScrPara+s32)+c8)=i16; 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172091.html原文链接
请参阅下面的示例,其中我将交换两个变量的值。 do-while(0)结构很不错 #include <stdio.h> #define swap(x,y,...
这个区别带来的实质差异是:宏定义最终是在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行,执行完后再跳转回来。...注:宏定义和函数的最大差别就是:宏定义是原地展开,因此没有调用开销;而函数是跳转执行再返回,因此函数有比较大的调用开销。...所以宏定义和函数相比,优势就是没有调用开销,没有传参开销,所以当函数体很短(尤其是只有一句话时)可以用宏定义来替代,这样效率高。...(2)带参宏和带参函数的一个重要差别就是:宏定义不会检查参数的类型,返回值也不会附带类型;而函数有明确的参数类型和返回值类型。...: C99中规定宏可以像函数一样带有可变参数,实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个英文输入法下的句号)。
虽然简单的宏常用于定义常量名,但是它们还有其他应用。 4) 、可以对C语法做小的修改。实际上,我们可以通过定义宏的方式给C语言符号添加别名,从而改变C语言的语法。...IS_EVEN则类似于另一种函数,该函数当参数为偶数时返回1,否则返回0。 下面的例子是一个更复杂的宏: #define TOUPPER(c)('a'c)&&(c)宏会在预处理过程中被删除,所以不存在类似的“指向宏的指针”。因此,宏不能用于处理这些情况。 4) 、宏可能会不止一次地计算它的参数。函数对它的参数只会计算一次,而宏可能会计算两次甚至更多次。...这种方式适用于宏定义中存在多语句的情况。...实际上,C语言库提供了一个通用的、用于错误检测的宏——assert宏 再如: #line 838 "Zend/zend_language_scanner.c" #line预处理用于改变当前的行号
题目描述 从键盘输入三个字符,用空格隔开,使用带参宏定义1中SWAP,将三个字符按从大到小的顺序排序输出。...宏定义1:#define SWAP(a, b, t) { t=a; a=b; b=t; } 请尝试,如果用宏定义2中的SWAP,主函数需要如何修改才能得到正确结果?...宏定义2:#define SWAP(a, b, t) t=a; a=b; b=t; 输入 输入三个字符,用空格隔开 输出 输出占一行,包含三个字符,用空格隔开 样例输入 Copy w a q 样例输出... #define SWAP(a, b, t) t=a; a=b; b=t; int main(){ char ch[3]; char a,b,t,i,j; scanf("%c...%c %c",&ch[0],&ch[1],&ch[2]); for(i=0; i<3; i++){ for(j=i+1; j<3; j++){ a=ch[i]; b=ch[j];
函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。...函数宏本质上为宏,可以直接进行定义,例如: #define INT_SWAP(a,b) \ int tmp = a; \ a = b; \ b = tmp...\n"); } 可见,不使用 ; 的调用方式无论从程序阅读还是使用方法方面都是十分别扭的;而规定必须使用带花括号的 if 的调用方式有违常理的,因为宏函数应该适用于任何语法。...缺点:不支持提前退出函数宏;非 C 的原生语法,编译器可能不支持。 5....({}) 或直接定义函数。
这经常用于包含头文件. 要调用该宏, 只需在代码中指定宏名称, 该宏将被替代为它被定义的内容. 函数宏 带参数的宏也被称为"函数宏"....在定义和调用函数宏时候, 要注意一些问题: 1, 我们经常用{}来引用函数宏被定义的内容, 这就要注意调用这个函数宏时的";"问题. example_3.7:...通过__VA_ARGS__来替换函数宏中的可变参数列表. 注意__VA_ARGS__只能用于函数宏中参数中包含有"..."的情况. e.g....应该避免重新定义函数宏, 不管是在预处理命令中还是C语句中, 最好对某个对象只有单一的定义. 在gcc中, 若宏出现了重定义, gcc会给出警告...., 所以他们也经常用于printf, puts之类的字符串显示函数中.
我们在使用C语言编写程序的时候,常常会使用到宏定义以及宏编译指令,有的可能比较常用,有的可能并不是很常用,是不是所有的C语言宏定义以及宏指令你都清楚呢?...指令 用途 # 空指令,无任何效果 #include 包含另外一个文件 #define 定义宏 #undef...取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef...#运算符 出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。 ##运算符 用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。...,它就是个非零值 __TIME__ 包含当前时间的字符串 另外在GCC下面,还有如下的宏定义: __FUNCTION__ 表示当前的函数名 __VA_ARGS__ 表示可变参数输入
但是并没有如何将用于其他目的的宏大写的统一做法。由于宏(特别是带参数的宏)可能是程序中错误的来源,所以一些程序员更喜欢使用大写字母来引起注意。...,就像真正的函数那样。...,但是C++/C程序员不要定义很复杂的宏,宏定义应该简单而清晰。...对于较长的使用频率较高的重复代码片段,建议使用函数或模板而不要使用带参数的宏定义;而对于较短的重复代码片段,可以使用带参数的宏定义,这不仅是出于类型安全的考虑,而且也是优化与折衷的体现。...尽量避免在局部范围内(如函数内、类型定义内等)定义宏,除非它只在该局部范围内使用,否则会损害程序的清晰性。
领取专属 10元无门槛券
手把手带您无忧上云