汉扬编程 编程大纲 不可小看的编程技术——C语言/C++编程学习中的“宏”

不可小看的编程技术——C语言/C++编程学习中的“宏”

C语言是面向过程的,而C++是面向对象的

不可小看的编程技术——C语言/C++编程学习中的“宏”

C和C++的区别:

不可小看的编程技术——C语言/C++编程学习中的“宏”

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

不可小看的编程技术——C语言/C++编程学习中的“宏”

C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

不可小看的编程技术——C语言/C++编程学习中的“宏”

C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

不可小看的编程技术——C语言/C++编程学习中的“宏”

宏界说是我们C说话进修中很是重要的内容。一些根本的用法大师都斗劲清楚了,我们简单总结一下。

宏界说的名目为:#define标识符 字符串

宏界说属于预措置呼吁,在编译过程中的预措置阶段措置

宏界说只是纯挚的替代,所以当被替代内容涉及运算等的时辰最好加上括号()

宏界说的标示符一样平常用大写。

宏界说的标示符为常量标示符,即不成再赋值。

宏界说末尾不加分号。

以上说的是宏界说的最根基用法,可以带来良多好处。比如让我们的标示符成心义,让我们的代码改削更便当,可以替代在代码中常用的字符串缩短代码等。其其实宏界说中,我们也可以像一个“函数”一样实现一个的功能,这种用法叫函数宏,函数宏在我们对宏界说的使用中加倍的常见,下面我们从五个方面来体味下函数宏的使用。

函数宏的书写

#define MAX(a,b) ((a)>(b)?(a):(b)) ,这就是一个简单的函数宏,我们同样可以通报参数,实现功能。可是在书写上注意两点MAX和左“(”之间没有空格,由于宏界说把标示符后的第一个空格会认为是标示符与字符串的朋分。固然我们在写宏的时辰偶尔辰会写多行,如许我们一样平常用“”停止朋分

加括号

我们说到宏只是简单的替代,即使是函数宏也是如许的,所觉得了按捺一些优先级的错误不要健忘加括号

宏的副浸染

这也是函数宏和函数不合的地方。比如上边的例子#define MAX(a,b) ((a)>(b)?(a):(b))我们传入的参数是++a和++b。很显然若是使用函数实现这个功能的话a和b均自加一次,可是若是用宏实现替代后就变成((++a)>(++b)?(++a):(++b)),很较着,这与函数就完全不合了。

do{}while(0)构造

例如:

#define DELETE_POINTER(p)

do

{

if(NULL != p)

delete p;

p = NULL;

}while(0)

这种构造在函数宏里很是常见,它不仅可以在挪用后加分号保持代码的名目同等性,还可以按捺一些复杂的宏界说产生的错误。固然,每行后面不要忘了也是必要””的。

函数宏中的#和##运算符

在函数宏中#可以实现由函数宏实参生成字符串常量,##实现了由函数宏实参生成标识符的一局部。(前者用于拼接字符串后者用于拼接标示符)看一下下边的示例:

#

假设希望在字符串中包含宏参数,ANSI C容许如许作,在类函数宏的替代局部,#符号用作一个预措置运算符,它可以把说话符号转化程字符串。例如,若是x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).

#incldue

#define PSQR(x) printf(\”the square of\” #x \”is %d. \”,(x)*(x))

int main(void)

{

int y =4;

PSQR(y);

PSQR(2+4);

return 0;

}

输出成效:

the square of y is 16.

the square of 2+4 is 36.

第一次挪用宏时使用“y”庖代#x;第二次挪用时用“2+4\”代#x。

##

##运算符可以使用类函数宏的替代局部。别的,##还可以用于类工具宏的替代局部。这个运算符把两个说话符号组合成单个说话符号。例如:

#define XNAME(n) x##n

如许宏挪用:

XNAME(4)

睁开后:x4

轨范:

#include

#define XNAME(n) x##n

#define PXN(n) printf(\”x\”#n\” = %d \”,x##n)

int main(void)

{

int XNAME(1)=12;//int x1=12;

PXN(1);//printf(\”x1 = %d \”, x1);

return 0;

}

那么说了这么多,大师必定有疑问,函数宏和函数的区别又有什么呢?

我们把上面第一条的例子用函数来实现:

int max( int a, int b)

{

return (a > b a : b)

}

若是这段代码要频仍使用,让我们选择用函数宏或者用函数来实现。很显然,我们不会选择用函数来完成这个使命,缘故缘由有两个:首先,函数挪用会带来分外的开销,它必要斥地一片栈空间,记实前往地点,将形参压栈,从函数前往还要释放堆栈。这种开销不仅会降低代码服从,并且代码量也会大大添加,而使用宏界说则在代码规模和速度方面都比函数更胜一筹;其次,函数的参数必需被声明为一种特定的类型,所以它只能在类型适宜的表达式上使用,我们若是要斗劲两个浮点型的巨细,就不得不再写一个专门针对浮点型的斗劲函数。反之,上面的阿谁宏界说可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用“>”把持符斗劲值巨细的类型,也就是说,宏是与类型无关的。和使用函数比力,使用宏的不利之处在于每次使用宏时,一份宏界说代码的拷贝都市插入到轨范中。除非宏很是短,不然使用宏会大幅度添加轨范的长度。还有一些使命根柢无法用函数实现,可是用宏界说却很好实现。比如参数类型没法作为参数通报给函数,可是可以把参数类型通报给带参的宏。

看下面的例子:

#define MALLOC(n, type)

( (type *) malloc((n)* sizeof(type)))

把持这个宏,我们就可觉得任何类型分配一段我们指定的空间巨细,并前往指向这段空间的指针。我们可以不雅观不雅观察一下这个宏切当的工作过程:

int *ptr;

ptr = MALLOC ( 5, int );

将这宏睁开往后的成效:

ptr = (int *) malloc ( (5) * sizeof(int) );

这个例子是宏界说的经典应用之一,完成了函数不能完成的功能。

把类型作为函数宏参数是C说话实现泛型的一种手段,这也是函数宏最常用的场合之一。在后续出现的编程说话入C++中把这种需求作为一种新的语法特征(模板)加以实现。

我们首要引见了函数宏的用法,谙练的把握还必要更多的练习,希望在以后代码编程过程中可以将函数宏融入我们的代码,使我们的代码程度不竭进步。

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6213.html

C/C++编程小技巧-宏的使用

深度 | 跨平台Web Canvas渲染引擎架构的设计与思考

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部