内联是C++设计时用于取代宏的机制,后来被C采纳,也可以用内联了,也就是说,传统的C多用宏,新式的C应转用内联。这与C原本要求变量声明在函数的开始处,后来标准引入C++的做法,允许变量就近声明,以增强可读性。C的新标准,很多是从C++来的。
C++和C的关系。最早,C++是作为C的扩展而出现,++是Plus,加法的意思,++在C的后面,表示C之后的扩展。C++很多语法是为了加强C的性能和弥补缺陷而来的,当我们不使用C++的面向对象思想进行编程的时候,完全可以把C++作为加强版的C使用,写出面向过程的代码,只不过那必须用C++编译器罢了(C99的不少新规定已经向此靠拢)。C++对C的加强(即排除面向对象的部分),基本上是依据编程实践而来的,比如变量就近声明,是因为人脑阅读代码,当到达变量使用的区域,最好就在使用之前瞬间看到变量是如何声明和定义的,而不是让人往前翻页去查看集中在开头处的声明,这样来回翻页的动作可能会干扰人的思维(其实跟人阅读书面文章一样),诸如此类的东西,都是为了更人性化的界面(代码的书写的布局就是呈现给程序员看的界面,必须友好和符合人的思维习惯)。这是C++的设计原则,相反,C最早是设计用于与机器打交道的,不会照顾人,但C++的原则是在保留C的高效性的同时改善与人的关系。
这些就是C++与C共有的东西。比如内联,用宏固然能实现,但编译器是不检查宏的参数类型的,如果程序员在后面使用宏的时候,输入了与意图不符的参数,编译器根本检查不出来(因为宏的处理在编译之前,在语言语法起作用之前就把代码展开了,它只检查展开之后的代码的合法性,而那样是没有参数类型声明的),这一点,与C语言的强类型语言的本质不符,等于取消类强类型语言的优势,还不如直接用解释语言写程序。C++为了弥补这个缺陷,就推出了内联机制,它在代码的嵌入方面与宏是一样的,但却保留了参数类型检查这一关键环节。这个例子,也等于向你解释了C++是如何针对C的缺陷而扩展语言的,它针对什么,为什么要这样,理解C++,实际上也等于理解C,如果你不知道内联的这种机制解释,就不大理解人家为什么不推荐用宏,也知道很多保守的C程序员看古老代码学来大量的宏语法其实是不可取的,自己写程序也知道怎么回事,即使是用宏,也有相关的风险意识,懂得回避,也知道查错从哪入手。其实,我一向不鼓励人保守,推荐多学几门语言,互相比较,才能对主要语言有深刻的理解,不至于人云亦云,什么大师、大神说如何如何,不至于轻信。坛上也见过不少宏的迷信者,觉得写出如此这般神奇的宏代码是多么牛逼,但实际上别人可能不以为然,不过,这属意识形态问题了,各人取向,不能强求——但明白是怎么回事总不坏。