什么是链接属性 链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不同文件的标识符(即程序中定义的各种名称,包括变量名、函数名)是否是同一个实体。更通俗地
什么是链接属性链接属性与C语言中各个目标文件及函数的链接过程有关,用于认定不同文件的标识符(即程序中定义的各种名称,包括变量名、函数名)是否是同一个实体。更通俗地说,就是在两个不同文件中的变量、函数声明是否指向同一个实体。比如:a、b文件同时声明了变量c,链接属性就指定了这两处变量c是否是同一个c。 简单来说,链接属性的作用就是让你能在a文件中决定要不要访问b文件中的变量、函数。 链接属性的分类链接属性有三种:
对于external属性的标识符,不同文件中出现的多个同名称标识符指向同一个实体。在C语言中,用extern关键字在声明中指定以引用其他文件中定义的相同标识符。 对于internal属性的标识符,仅在当前文件内该标识符指向同一个实体。在C语言中,用static关键字在声明中指定让标识符变为该文件私有(只有对原本缺省的链接属性为external的标识符,才能用static关键字改变其链接属性为internal)。 对于none属性的标识符,在每个声明位置都是一个新的实体。C语言中,没有对应的关键字。 默认的链接属性标识符的默认的链接属性与其出现的位置有关。
在以下例子中,b、c、f的链接属性就是external:
实践应用extern在a文件中想要使用b文件中定义的external属性标识符,可使用extern关键字在a文件中声明。
static在a文件定义了一个全局标识符,但不想被其他文件访问,可以对该标识符加上static关键字。 在a、b文件中定义了同样的标识符,通过static关键字可以避免多重定义问题。
一些细节
思考题internal和none属性除了作用域不同还有什么区别? 以下代码一定程度上阐释了部分区别:
文件作用域已经能让程序访问同一文件变量,那么再进行内部链接的意义在哪? 同一个标识符在链接中只能存在一个,那么通过内部链接的方式可以隔绝同名外部链接,且限定了外部编译单元不能访问该文件全局标识符。 a.c:
b.c:
编译后结果为:
参考
|
2022-05-14
2021-11-29
2022-04-04
2022-06-24
2021-11-25