跟我学C++中级篇——内联的语义
一、语义
语义,semantic。大白话就是语言中包含的意思。这么说吧,别人说某人有点虎,大家立刻明白了什么意思,这就是语义。编程语言是由字母和符号组成的一系列的规则组成的(语法),而由此对需求的具体实现就代表了需求(行为和目的),需求是人眼中的语义,而那些字母等所实现的内容是编程语言的语义。这样说可能不太专业,但比较通俗易懂,如果想要更严格更清晰、准确的定义,可以参看《编译原理》以及其它相关书籍。
二、内联的语义
在明白了什么是语义后,就回到本文。什么是内联的语义?在前面分析过ODR规则(单一定义规则),也就是正常的情况下所有的编译单元只能有一个定义。这个非常好理解,大家在学习C/C++时如果定义两个相同名字的变量或函数时,编译器会报这个错误。那么凡事总会有例外,能不能够允许在某些情况下可以有重复的定义呢?标准在向前推进,所以这个答案是肯定的。那就是inline的函数和变量。
从语义上看,就是允许重复定义的函数和变量,或者可以理解成让编译器忽略对此类命名的重复性检查。
内联在前面反复提到过,正常情况下,编译器是不保证有inline关键字的函数被真正转为内联。原因就在于内联的一个主要特点就是小,这个小不单纯指代码少(可参看前面的相关文章)。所以从反方向思考问题,其实可以说是对外联的一种补充。告诉编译器,这个其实开发者是想内联的。
从语义上考虑内联,其实可以从开发者的角度来认识inline关键字的意义,这也是一种非常好的容易理解的学习过程。
三、总结
内联这个问题,反复分析了很多次,每次都会有新的认识。从不同的角度看这个问题,会产生不同的看法,然后与前面的角度共同结合,就会有更新的认知产生。这也是不断的对inline内联进行分析的原因。从简单入手,把薄书读厚,真正全面的掌握其内在的各种知识。这不是陷入细节,是从更严谨的视野为更高层次的抽象做准备。
知行合一,与诸君共勉!