首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C 语言函数宏封装妙招

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。...因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0) 和 ({})。下文将一一对三种方式进行分析,比较各自的优劣点。...不同的是,do{...}while(0) 可以提前退出函数宏、整合为一条语句与强制调用时必须使用 ;。...{...}while(0) 不同的是,({}) 不能提前退出函数宏与支持返回值。...({}) 毕竟不是 while 循环,不能直接使用 break退出函数宏是比较容易理解。那支持返回值是什么意思呢? 答案是 C 语言规定 ({}) 中的最后一条语句的结果为该双括号体的返回值。

    19010

    C++ Trick:宏函数与模板类之殇

    原因是宏函数DECLARE接收两个参数,而如果把map传入,那么编译器预处理会把map里的逗号视作宏函数的分隔符,也就是拿到了三个参数: map<string int> msi 尽管前面两个是语义无法解释的...,但是在宏函数参数个数校验的环节就失败了。...using MSI = map; DECLARE(MSI, msi); 注意编译的时候,g++加选项-std=c++11 。...也许你说,我根本不会定义一个DECLARE这样的宏函数(或者说函数宏)。类似的需求也可以用模板函数来实现。当然,我这里只是举例子,这个例子是基于我之前工作中遇到的一个代码场景简化后的demo。...但是我相信你可能有机会接触到类似接口的宏函数,使用的时候慎重就可以了。

    65220

    C中的预编译宏定义

    在gcc中, 进行编译预处理的程序被称为CPP, 它的可执行文件名为cpp. 编译预处理命令的语法与C语言的语法是完全独立的....比如: 你可以将一个宏扩展为与C语法格格不入的内容, 但该内容与后面的语句结合在一个若能生成合法的C语句, 也是可以正确编译的....但在调用函数宏时, name与(之间可以有空格. e.g. #define mul(x,y) ((x)*(y)) 注意, 函数宏之后的参数要用括号括起来, 看看这个例子: e.g....通过__VA_ARGS__来替换函数宏中的可变参数列表. 注意__VA_ARGS__只能用于函数宏中参数中包含有"..."的情况. e.g....应该避免重新定义函数宏, 不管是在预处理命令中还是C语句中, 最好对某个对象只有单一的定义. 在gcc中, 若宏出现了重定义, gcc会给出警告.

    2.9K40

    C语言 第八章 函数、指针与宏

    write once only once #include "stdio.h" //定义函数 //int 表示函数的返回值,无返回值void,return返回值 //sum 表示函数名称,与变量命名规则相同...这些参数可以在替换列表中根据需要出现任意次。 在宏的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是在定义一个简单的宏,其中(x1,x2,…,xn)是替换列表的一部分。...它们是: __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ C++中还定义了 __cplusplus 如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持...如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。 __cplusplus 与标准c++一致的编译器把它定义为一个包含至少6为的数值。...与标准c++不一致的编译器将使用具有5位或更少的数值。

    92250

    C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)

    一、#define的基本语法 在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。...: 5 * 5 注意: 参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。...但是对于宏,不能出现递归。​ 2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。​ 七、宏与函数的对比​ 宏通常被应用于执行简单的运算。...用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。 2. 更为重要的是函数的参数必须声明为特定的类型。...宏可能会带来运算符优先级的问题,导致程容易出现错。 宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到。

    98510

    Objective-C中的预处理器指令与宏

    预处理器指令 头文件包含 学C语言的时候就接触到了#include,学java也会用到import(注意没有#号),都是用来导入头文件的,这个作用我们明白,OC中的导入头文件有#include和#import...预处理器之宏 要知道,宏也是预处理器范畴内的内容,我们用的也很多: // 定义常量值 #define 宏名 值 //定义函数宏 #define 宏名(参数) 代码 // 移除宏 #undef 宏名 宏被定义后...如果函数有多个参数,用逗号分隔开。 定义函数宏的时候,有一个细节要注意,就是要多对参数使用括号: #defind SQUARE(x) ((x) * (x)) 为什么要这么麻烦?...要知道,宏在这个意义上是很“傻”的,它只会单纯的将你输入的x值拿去替换函数代码中的x,并不会做什么处理,所以如果你这样输入就会造成没有意料到的结果: #defind SQUARE(x) x * x int...结 以上就是OC编译中的预处理器中的一些预处理语言函数的内容,预处理器的内容当然不单单只有这些,还有对源文件的一些处理,但这些是我们平常开发中经常遇到的,了解他们是必须且重要的。 查看作者首页

    72330

    自定义函数与宏定义

    前面,我们既一起研究了自定义函数的题,有看了宏定义的题,下面这题刚好就是要用自定义函数和宏定义解题的,帮大家巩固知识点 题目描述 分别用函数和带参的宏,从三个数中找出最大的数。...输入 3个实数 输出 最大的数,输出两遍,先用函数,再用宏。 保留3位小数。...样例输入 1 2 3 样例输出 3.000 3.000 大家会发现宏定义比自定义函数简单,方便,但自定义函数的功能更加强大 PS:宏定义只是简单的宏替换 详细题解见C语言网题库1041题 比赛也打完了,...不知道大家有没有取得理想的成绩呢,下期我们来看看有哪些大牛!...另外,有兴趣的同学还可以加入C语言网官方微信群,一起讨论C语言 通过加小编:dotcppcom 备注:C语言网昵称(需要先在C语言网注册哦) 就让我们 向着更加美好的明天 加油!加油!加油!

    1.1K50

    C语言有参数宏定义与无参数宏定义

    C语言中宏定义分两种,无参的宏和有参的宏 1.无参数的宏        无参数宏定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值...(注释与字符串常量除外)均用值替换。...带参的宏,类似与函数,看下面的程序,输出我给了,读者可以先分析 #include using namespace std; #define swap1(a,b) t=a;a=b;b...,而宏交换了,但是如果把函数中的参数改为指针或者引用就能成功交换了。...参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。        5. 函数只在目标文件中存在一处,比较节省程序空间。        6.

    2.9K30

    宏函数使用的陷阱

    在嵌入式软件设计中,有工程师经常会定义一些宏函数,宏函数的使用虽然可以减少开销,但是宏函数的使用一定要小心,例如我们定义一个求取两个数中的较大者的宏函数来做试验。在调用的地方打断点观察值。...通过仿真可以看到a的值累加了两次,如果a在用作其他用途,那么累加两次显然不是我们要的。 通过仿真可以看到累加了一次。 对于宏函数可以改为内联函数代替。所以提醒大家在使用宏函数的时候要小心。...在程序设计中可以尽量考虑使用const,enum,inline等代替#define,当然并不是说不使用#define,在预编译控制中还是要使用,在遇到什么问题的时候最好自己动手去做试验,分析。...不要只是停留在别人的人云亦云上,有可能别人说的错误给你带来误解。你们在使用过程中有遇到过什么问题也欢迎给我们投稿讨论。

    1K90

    宏与C预处理器

    2018 / 10 图片来源于网络 C语言入门到精通 公众号 闫小林 通常的目标是:书写一个像包含一个单独的函数调用语句的宏, 这意味着:调用者需要提供最终的分号,而宏体则不需要。...1 "FILENAME.C" chag_line.c说明了#line的用法 ?...C语言入门到精通 4 参数个数可变的宏的书写 一般用一个单独的用括弧括起来的”参数“定义和调用宏,参数在宏扩展的时候成为类似printf()那样的函数的整个参数列表。...5 sizeof不能用于#if预编译器指令中,因为此时还未对类型名称作解析 m4工具是用于多用途的预处理器 比较宏与函数如果比较注重效率和速度,就用宏,如果比较在乎程序大小就用函数。...预定义的值和宏都在include的目录下 END

    6193129
    领券