
定义两个带参的宏s,一个用来求area,另一个宏用来求。带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。如果宏configuse_malloc_failed_hook设置为1,那么必须定义一个malloc()失败钩子函数,如果宏configuse_malloc_failed_hook设置为0,malloc()失败钩子函数不会被调用,即便已经定义了这个函数。
1.宏定义是在预处理期间完成的,而函数是在编译期间完成的。这个区别带来的实质差异是:宏定义最终是在调用宏的地方把
宏体原地展开,而函数是在调用函数处跳转到函数中去执行,执行完后再跳转回去。
注:宏定义和函数的最大差别就是: 宏定义是原地展开,因此没有调用开销;而函数是跳转执行再返回,因此函数有调用开销
产生。所以宏定义和函数相比,优势就是没有调用开销,没有形参赋值的开销,所以当函数体很短(尤其是只有一句话时)
可以用宏定义来替代,这样效率高。

2.带参宏和带参函数的一个重要差别就是:宏定义不会检查参数的类型,返回值也不会附带类型;而函数有明确的参数类型和
返回值类型。当我们调用函数时编译器会帮我们做参数的静态类型检查,如果编译器发现我们实际传参和参数声明不同时会
报警告或错误宏函数 内联函数。
注: 用函数的时候程序员不用太操心类型不匹配,因为编译器会检查,如果不匹配编译器会报错,用宏的时候程序员必须很注意
很小心实际传参和宏所希望的参数类型一致,否则可能编译不报错但运行有误。 把我们给坑害了。
总结: 宏和函数各有千秋,各有优劣。总得来说,如果代码比较多用函数适合而且不影响效率;但是对于那些只有一两句话的

函数开销就太大了,适合用带参宏宏函数 内联函数。但是用带参宏又有缺点;不检查参数类型。很容易传错。
(2)内联函数和inline关键字
1.内联函数通过在函数定义前加inline关键字实现。
2.内联函数本质上是函数,所以有函数的优点(内联函数是编译器负责处理的,编译器可以帮我们做参数的静态类型检查)。但是他
先说宏和函数的区别:1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.5. 函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.现在来看内联函数:所谓"内联函数"就是将很简单的函数"内嵌"到调用他的程序代码中,只样做的目的是为了避免上面说到的第5点,目的旨在节约下原本函数调用时的时空开销.但必须注意的是:作为内联函数,函数体必须十分简单,不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了。当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为this,传入 bind()方法的第二个以及以后的参数作为绑定函数的预设参数,加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
若type为一个符合二元函数对象的类型参数,则可通过typename type::first_argument_type表示它的第一个参数类型 对于普通函数,使用ptr_fun也可得到具备类型参数的函数对象 * 深度探索 迭代器的类型特征 若t为一迭代器类型,则可通过“iterator_traits ::特征名”得到相关类型参数,迭代器有以下特征: difference_type:表示两迭代器举例的类型 value_type:迭代器所指向数据的类型 pointer:迭代器所指向数据的指针类型 reference:迭代器所指向数据的引用类型 iterator_category:迭代器的分类标签 * 深度探索 例10-26 利用类型特征实现算法: * //将来自输入迭代器p的n个数值排序,将结果通过输出result输出 template class inputiterator, class outputiterator void mysort inputiterator first, inputiterator last, outputiterator result //通过输入迭代器p将输入数据存入向量容器s中 vector typename iterator_traits ::value_type s first, last 。注意函数在被调用之前要有函数原型的声明,形式“函数类型 函数名(参数类型列表)”。许多受管辖的动态链接库函数期望你能够传递一个复杂的参数类型给函数,譬如一个用户定义的结构类型成员或者受管辖代码定义的一个类成员,这时你必须提供额外的信息格式化这个类型,以保持参数原有的布局和对齐。

开销时,最适合使用内联函数。
(3)宏定义来实现条件编译(#define #undef #ifdef)
#define DEBUG
//#undef DEBUG //取消DEBUG宏的定义
#ifdef DEBUG
//设置显示信息的详细程度 - 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。//设置显示信息的详细程度,4或更大值会显示头信息,3或更大值可以显示响应码(404,200等),2或更大值可以显示警告和其他信息。python2.7中调用print打印var 变量时,操作系统会对var做一定的字符处理:如果var是str类型的变量,则直接将var变量交付给终端进行显示。

#else
#define debug(x,y)
#endif
使用方法: int i = 5;
debug('出错在XXX函数里%d',i);
debug('出错在XXX函数里%d',0);
1.程序有DEBUG版本和RELEASE版本,区别就是编译时有无定义DEBUG宏。
2.用宏定义来控制条件编译
举报/Report
同时转发到微博
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-101606-1.html
何为发财