EasyC++,函数和语言链接性

开发 后端
关于const的含义和使用我们之前已经讨论过了,但const限定符对于默认存储类型是有影响的。

 [[437583]]

大家好,我是梁唐。

想要追求更好阅读体验的同学,可以点击「阅读原文」访问github仓库。

const

关于const的含义和使用我们之前已经讨论过了,但const限定符对于默认存储类型是有影响的。

在默认情况下,全局变量的链接性是外部的,也就是说所有文件均可使用。但const全局变量的链接性是内部的,也就是说只能在本文件当中使用。全局const定义就好像使用了static说明符一样。

这个设定看起来有些令人费解,其实是编译器中的一个优化。因为我们常常将一组常量放在头文件当中,并且在多个文件当中include这个头文件。如果const声明的链接性也是外部的,根据单定义规则,这会出错。正是为了避免这种情况发生,所以编译器做了优化,规定了const关键字修饰的全局变量,链接性也为内部。

如果出于某种原因,程序员希望某个常量的链接性为外部的,可以使用extern关键字来覆盖默认的内部链接性:

  1. extern const int states = 30; 

在这种情况下,必须所有使用了该常量的文件中使用extern关键字来声明它。然而,由于const在多个文件之间共享,因此只有一个文件可以对它进行初始化。

函数和链接性

和变量一样,函数也有链接性。和C语言一样,C++不允许在一个函数当中定义另外一个函数,因此所有函数的存储持续性都默认是静态的,即在整个程序运行期间都一直存在。

在默认情况下,函数的链接性是外部的,也就是说可以跨文件使用。我们可以使用关键字static来讲函数的链接性设置成内部的,这样就只有当前文件可以使用。

我们必须同时在原型和定义当中使用static:

  1. static void test(); 
  2.  
  3. static void test() { 
  4.     return ; 

单定义规则对于函数也一样适用,也就是说对于非内联性函数来说,程序只能包含一个定义。对于链接性为外部的函数,只有一个文件包含该函数的定义。但使用该函数的每个文件,都应该包含函数的原型。

简单来说,这就是为什么我们通常将函数的原型写在头文件当中,而实现单独放在另外一个cpp文件中的原因。因为这样,所有include该头文件的文件都包含了函数的原型,但只有对应的cpp文件拥有函数的定义。这样就保证了一定不会违反单定义规则。

语言链接性

背景知识:链接程序要求每个不同的函数拥有不同的符号名,比如C语言编译器可能将spiff函数翻译成_spiff,这被称为C语言链接性。而C++当中,同一个名称可以对应多个函数(函数重载),因此必须将这些函数翻译成不同的名称。

比如spiff(int)可能翻译成_spiff_i,spiff(double, double)翻译成_spiff_d_d。这种方法被称为C++语言链接。

如果要在C++程序当中使用C库中预编译的函数可能就会名称对不上,所以为了解决这个问题,我们可以用函数原型来指出要使用的约定:

  1. extern "C" void spiff(int); 
  2. extern void spoff(int); 
  3. extern "C++" spaff(int); 

第一个原型使用的C语言链接性,后面两个使用的都是C++语言链接性。只不过第二个是通过默认方式实现的,而第三个是显式指出的。

本文转载自微信公众号「Coder梁」,可以通过以下二维码关注。转载本文请联系Coder梁公众号。

 

责任编辑:武晓燕 来源: Coder梁
相关推荐

2021-12-09 10:56:50

函数C++原型

2021-12-10 10:45:36

C++函数Stock

2021-12-11 19:02:03

函数C++对象

2021-12-12 18:13:54

C++This指针

2021-11-10 10:48:36

C++函数指针

2021-11-26 10:56:28

C++存储持续性

2021-11-09 10:38:16

C++Const指针

2021-12-29 20:31:40

C++多态指针

2021-11-26 00:03:20

C++编译常量

2021-12-08 10:43:09

C++实现

2021-12-30 14:58:58

C++函数动态

2021-10-26 00:19:51

C++结构体存储

2021-12-03 10:48:18

Using编译指令

2021-11-27 11:50:09

C++静态持续

2022-01-07 15:10:53

C++动态内存

2021-12-01 10:50:31

C++存储动态

2021-12-26 00:08:35

C++初始化列表

2021-12-16 10:40:11

C++运算符重载

2021-10-21 18:52:00

C++数组存储

2021-12-14 10:12:58

C++抽象数据
点赞
收藏

51CTO技术栈公众号