stream was reset: CANCEL
前面,我们既一起研究了自定义函数的题,有看了宏定义的题,下面这题刚好就是要用自定义函数和宏定义解题的,帮大家巩固知识点 题目描述 分别用函数和带参的宏,从三个数中找出最大的数。...输入 3个实数 输出 最大的数,输出两遍,先用函数,再用宏。 保留3位小数。...样例输入 1 2 3 样例输出 3.000 3.000 大家会发现宏定义比自定义函数简单,方便,但自定义函数的功能更加强大 PS:宏定义只是简单的宏替换 详细题解见C语言网题库1041题 比赛也打完了,
最近做某项目撸代码时用到了offsetof宏,第一次使用这个宏,项目结束后对其用法也略知一二,现分享如下。...位于stddef.h中的offsetof()宏,是获得struct中某成员相对于struct首地址的偏移量,以byte为单位,用struct首地址加该偏移量获得该成员的实际地址时,要把struct首地址强制转换成以...byte为计数单位,地址本身一般都是32位(与芯片架构有关),强制转换的计数单位不会影响地址本身,该计数单位是告诉程序,对地址做运算时,偏移量是以该计数单位为单位的。...比如,此处偏移量是以byte为单位的,故将struct首地址强制转换成以byte为计数单位,若将struct首地址强制转换成以2byte为计数单位,则该首地址与偏移量做运算时,将一个偏移量认为是2byte
Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作变得更容易”。...但是对于宏,不能出现递归。 2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。 七、宏与函数的对比 宏通常被应用于执行简单的运算。...用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。 2. 更为重要的是函数的参数必须声明为特定的类型。...所以函数只能在类型合适的表达式上使用。反之,这个宏怎可以适用于整形、长整型、浮点型等可以用于 > 来比较的类型。宏是类型无关的。 和函数相比宏的劣势: 1....宏可能会带来运算符优先级的问题,导致程容易出现错。 宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到。
题目描述 从键盘输入三个字符,用空格隔开,使用带参宏定义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 样例输出
适用场景 如果 函数执行时间 小于 函数调用(参数压栈,栈帧开辟与回收,结果返回),那使用宏或者inline能减少函数执行时间。...宏定义与inline函数异同 异:宏定义就是字符替换,不做类型检查;inline反之,相当于不用执行函数调用直接执行函数体。 同:宏和Inline函数的展开发生在预处理阶段。...预处理:简言之,将头文件,宏,inline函数展开,生成.i文件。 inline函数与成员函数 编译器可能会将 类中声明并定义的成员函数 自动转化为内联函数。...参考 待 inline构造函数 与 参数列表 比较
GCC 会为不同 CPU 架构预定义宏,如 __x86_64__ 代表Intel 64位CPU, __aarch64__代表 ARM64。...网上已经有文档对 GCC 为 CPU 的预定义宏进行了总结。 这些预定义的宏有什么用呢?我们在代码中可以判断出当前的 CPU 架构,那么可以针对 不同CPU的特性,进行优化实现。...网上没有搜到 GCC 对龙芯 CPU 的预定宏的文档说明,只能从源码中找答案: void loongarch_cpu_cpp_builtins (cpp_reader *pfile) { ...
1.无参数的宏定义 #define _CRT_SECURE_NO_WARNINGS #include #include #include /.../宏 常量 //1.不重视作用域 //2.可以用undef卸载宏 //3.宏常量 没有数据类型 void test() { #define MAX 100 } int main() { test();...int a = MAX; printf("%d", a); return 0; } 说明: 2.带参数的宏定义(宏函数) #define _CRT_SECURE_NO_WARNINGS...#include #include #include //宏 函数 //1.将短小,频繁使用的函数写成宏函数 //2.加括号保证运算完整性 //...函数 //1.将短小,频繁使用的函数写成宏函数 //2.加括号保证运算完整性 //3.优点:空间换时间 #define SUM(x,y) ((x)+(y)) void test() { int ret
对象宏 #define M_PI 3.1415926535 double r = 1.0; double circlePerimeter = 2 * M_PI * r; // => double circlePerimeter...= 2 * 3.1415926535 * r ## 函数宏 #define FUNC(x) x NSLog(@"Hello %@", FUNC("world"); // => NSLog(@"Hello
C++宏定义 学过C语言的读者,对宏定义应该不陌生,同样在C++中,也可以用宏定义命令将一个指定的标识符来代表一个字符串,宏定义的作用一般是用一个短的名字代表一个长的字符串。...一般形式为: #define 标识符 字符串 定义PI的符号常量: #define PI 3.14 在C++中还可以用#define命令定义带参数的宏定义,一般形式为: #define 宏名(参数表)...字符串 比如,定义宏正方形面积Area: #define Area(long,wide) long*wide 看完之前的推文的读者,应该知道C++中增加了内置函数,比用带参数的宏定义更方便,因此在C++.../命名空间 int main()//主函数 { int area,num1,num2;//定义变量 cout<<"请输入长和宽:"; cin>>num1>>num2; area=Area...(num1,num2);//调用第二行的宏定义 cout<<"面积是:"<<area;//输出面积 return 0; //返回值为0 } 执行本程序之后,会输出: 请输入长和宽:5 8 面积是
前面题目主要是自定义函数的题,相信经过这些题目的训练,大家对自定义函数的理解想必更近了一步。...接下来呢,我们主要来练习跟自定义函数异曲同工的宏定义,先看看下面这题 题目描述 三角形面积=SQRT(S*(S-a)*(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。...定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,在程序中用带实参的宏名来求面积area。 输入 a b c三角形的三条边,可以是小数。...输出 三角形面积,保留3位小数 样例输入 3 4 5 样例输出 6.000 PS:有句话很经典哦“宏定义只是简单的字符替换哦” 详细题解见C语言网题库1038题 明天就是咱们C语言网有奖月赛的日子了,希望大家积极参加哦
可以考虑用宏来做。......}比如我们想为所有表提供一个Has函数,可以写个宏:(如果对##的作用不了解可以点击看这篇文章)#define DECLARE\_DATA\_TABLE\_HAS\_METHOD(DataArray...has函数的模块中加上这个宏传入表和key信息就等于生成了一个该表的Has函数:DECLARE\_DATA\_TABLE\_CRUD\_METHOD(StudentInfoTable, StudentInfo..., int, Id)等价于bool StudentInfoTableHasKey(KeyType FindById){ //...}接下来就可以举一反三写出生成其它函数的宏,同时我们还可以写个宏来专门负责打包这些宏...KeyField)\DECLARE\_DATA\_TABLE\_FIND\_OR\_ADD\_METHOD(DataArray, RowType, KeyType, KeyField)\//...这样我们为每张表写增删改查函数就只需要一条宏
可以考虑用宏来做。...... } 比如我们想为所有表提供一个Has函数,可以写个宏: (如果对##的作用不了解可以点击看这篇文章) #define DECLARE_DATA_TABLE_HAS_METHOD(DataArray...has函数的模块中加上这个宏传入表和key信息就等于生成了一个该表的Has函数: DECLARE_DATA_TABLE_CRUD_METHOD(StudentInfoTable, StudentInfo..., int, Id) 等价于 bool StudentInfoTableHasKey(KeyType FindById){ //... } 接下来就可以举一反三写出生成其它函数的宏,同时我们还可以写个宏来专门负责打包这些宏...这样我们为每张表写增删改查函数就只需要一条宏: DECLARE_DATA_TABLE_CRUD_METHOD(StudentInfoTable, StudentInfo, int, Id) 完整样例代码
今天想要分享的是内联函数和宏定义。在我的某次笔试中也出现过一次。题目大意问的是在C语言和C++中分别用什么来处理一段短小、反复被调用的代码。...宏定义相信大家都很清楚了,即使是初学者,也知道宏定义有个好处是可以批量的替换一些变量啊或者一小段代码,提高程序的移植性。但是内联函数可能不是大家都知道。...既然宏定义和内敛函数都可以完成替换,为什么还要引入内联函数呢?因为使用宏定义有时会产生意想不到的错误,这也是笔试题中经常考的地方。 什么错误呢?来看下面的例子,只是在上面的例子上多乘一个2....2、在inline函数里一般不能含有复杂的控制语句,如for、switch等 3、inline函数是一种用空间换时间的措施,函数体不宜太长,否则反而会增大系统开销,一般为1~5条语句。...4、inline和宏定义相似,但不完全相同,宏定义只做简单的字符替换而不做语法检查,往往会出现意想不到的错误。
container_of 宏用来在给定一个变量的结构体类型,和这个变量的某个成员的地址的条件下,计算出这个变量的地址。...8 字节,所以 brightness 的偏移量为 8 同理可求得 link 的偏移量为 16,flags 的偏移量为 32 container_of 实例解析 #include #include...led 变量,不过这里我们假设 led 变量是在别处定义的,我们拿不到。...main 函数第一句仅仅是打印其地址,用作和后面求得的 led 变量地址做正确性验证。...从运行结果也可以看到,我们已知 led.link 的地址为 0x55745d380030,求得 led 的地址为 0x55745d380020,和代码一开始打印的 led 的地址相同,故结果正确。
用内联取代宏: 1.内联函数在运行时可调试,而宏定义不可以; 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,...宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。 ...文章(一) 内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如: #define MAX(a,b) ((a)>(b)?...a:b; } 1.内联函数与宏的区别: 传统的宏定义函数可能会引起一些麻烦。 ....");} } 如果想将一个全局函数定义为内联函数可用内联函数 c,inline 关键字。
C语言中宏定义分两种,无参的宏和有参的宏 1.无参数的宏 无参数宏定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值...宏定义的有效范围称为宏定义名的辖域(也可以叫做生命周期,类似于变量的生命周期),辖域从宏定义的定义结束处开始到其所在的源程序文件末尾。宏定义名的辖域不受分程序结构的影响。...2.有参数的宏 有参数宏的定义形式一般为: #define name(参数1,参数2,....) sentence//sentencen表示语句 //示例: #define max(a,b...参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。 5. 函数只在目标文件中存在一处,比较节省程序空间。 6....函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。 7. 函数的参数存在传值和传地址(指针)的问题,参数宏不存在。 3.
不带参数的宏的定义方式如下(这也是我们经常用到的宏定义) #define 宏名 字符串 //没有分号,说没有分号倒不如说最好不要加分号 这里说下原因吧:因为宏定义它并不是C语言的语句,所以不用加分号...在使用函数的时候我们需要注意它的数据类型,但是在宏当中我们是不需要注意的,想是整形就是整形想是浮点型就是浮点型。说明用宏在这里是更加灵活的只是处理简单问题上切记。...命名事项 相信有些小伙伴已经发现了这个函数的宏的使用语法和函数是非常类似滴。所以语言本身就会没办法帮我们区分二者的一些使用。...那么我们平时写宏或者函数的时候的习惯是↓ 宏明全部大写形式。 函数明不要全部大写,建议第一个字母大写。...✔拓展⇢用do...while(0)语句结构可以在宏插入多条语句的结构因为有花括号{}在。 #undef #undef 是为取消定义,用于移除一个宏的定义。
C语言提供的预处理功能有三种,分别为宏定义、文件包含和条件编译,下面将对它们进行简单介绍: 宏定义:在 C语言源程序中允许用一个标识符来表示一个字符串,称为“宏” ,被定义为“宏”的标识符称为“宏名”。...无参宏的宏名后不带参数,其定义的一般形式为: #define 标识符 字符串; 其中“#”表示这是一条预处理命令(在 C 语言中凡是以“#”开头的均为预处理命令)“define”为宏定义命令,“标识符...”为所定义的宏名, “字符串”可以是常数、表达式、格式串等。...带参宏定义的一般形式为: #define 宏名(形参表) 字符串; 在字符串中含有各个形参。...程序运行结果如下(□表示空格,↙表示回车) : input two numbers: 2009□2010↙ max=2010 可以看到,宏替换相当于实现了一个函数调用的功能, 而事实上,与函数调用相比
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。...实现方式: container_of(ptr, type, member) ; 其实它的语法很简单,只是一些指针的灵活应用,它分两步: 第一步,首先定义一个临时的数据类型(通过typeof...第二步,用(char *)__mptr减去member在结构体中的偏移量,得到的值就是整个结构体变量的首地址(整个宏的返回值就是这个首地址)。
二、关于“宏定义” 宏使用#define来进行定义,宏定义分为两种,一种是对象式宏,一种是函数式宏。...对象式宏通常对来定义量值,在预编译时,直接将宏名替换成对应的量值,函数式宏在定义时可以设置参数,其作用与函数很类似。...,看上去很完美,后面我们就使用这个函数式宏为例,来深入理解宏的原理。...对于不定参数的宏,借助##符号来拼接参数 在定义函数时,我们可以定义函数的参数为不定个数参数,定义函数式宏时也类似,使用符号"..."...以MAX宏为例,这个宏的编写基本涵盖了函数式宏所有要注意的点,如下: #define __NSX_PASTE__(A,B) A##B #if !
领取专属 10元无门槛券
手把手带您无忧上云