当前位置: 首页 > 科技观察

EasyC++,函数与语言联动

时间:2023-03-13 06:01:16 科技观察

大家好,我是梁唐。想要追求更好阅读体验的同学可以点击“阅读原文”访问github仓库。const我们之前讨论过const的含义和使用,但是const限定符对默认存储类型有影响。默认情况下,全局变量的链接是外部的,也就是说所有的文件都可以使用。但是const全局变量的linkage是internal的,也就是说只能在这个文件中使用。全局const定义就好像使用了static说明符一样。这个设置看起来有点莫名其妙,其实是编译器中的一种优化。因为我们经常会在头文件中放一组常量,并且在多个文件中包含这个头文件。如果const声明的链接也是外部的,这将在单一定义规则下出错。正是为了避免这种情况的发生,所以编译器对const关键字修饰的全局变量进行了优化,可链接性也是内部的。如果出于某种原因,程序员希望常量的链接是外部的,则可以使用extern关键字来覆盖默认的内部链接:externconstintstates=30;在这种情况下,常量的所有使用都必须使用extern关键字在文件中声明。但是,由于const是多个文件共享的,所以只有一个文件可以初始化它。函数和链接和变量一样,函数也有链接。和C语言一样,C++不允许在一个函数中定义另一个函数,所以所有函数的存储持久化默认是静态的,即在整个程序运行过程中一直存在。默认情况下,函数链接是外部的,这意味着它可以跨文件使用。我们可以使用关键字static将函数的链接设置为internal,这样就只能使用当前文件了。我们必须使用static:staticvoidtest();staticvoidtest(){return;}在原型和定义中。对于外部链接的函数,只有一个文件包含函数的定义。但是每个使用函数的文件都应该包含函数的原型。简单的说,这就是为什么我们通常把函数的原型写在头文件中,而把实现单独放在另一个cpp文件中的原因。正因为如此,所有包含头文件的文件都包含函数的原型,但只有对应的cpp文件才有函数的定义。这确保不会违反单一定义规则。语言链接背景知识:链接程序要求每个不同的函数有不同的符号名称,例如C语言编译器可能会将spiff函数翻译成_spiff,这就称为C语言链接。在C++中,同一个名字可以对应多个函数(函数重载),所以这些函数必须翻译成不同的名字。例如,spiff(int)可能被翻译成_spiff_i,spiff(double,double)可能被翻译成_spiff_d_d。这种方法被称为C++语言链接。如果要在C++程序中使用C库中的预编译函数,名称可能不匹配,那么为了解决这个问题,我们可以使用函数原型来指明要使用的约定:extern"C"voidspiff(int);externvoidspoff(int);extern"C++"spaff(int);第一个原型使用C语言链接,后两个使用C++语言链接。只是第二个是默认实现的,而第三个是明确指出的。本文转载自微信公众号“码农”,可通过以下二维码关注。转载本文请联系编码员梁公众号。