我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

c语言函数链接性 c语言互相关函数

关于c语言中变量有外部链接内部链接和无 链接怎么理解?

这部分内容是在程序的编译和link层面谈的。

成都创新互联是一家专注于成都网站设计、成都做网站与策划设计,隆林网站建设哪家好?成都创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:隆林等地区。隆林做网站价格咨询:18980820575

一个大一些的工程往往不是只有一个程序文件,经常由好多C程序文件构成,有的时候里面个别程序可能还用的其他语言,编码完成后常常分别编译,编译完成再link到一起。某个C程序需要用到其他程序中定义过的变量,一般都加extern前缀,编译时编译器会预留访问链接的空位,等到link阶段再在整个工程的其他C编译结果中去对号,把访问链接填上。这就是外部链接。如果你程序全写在一个文件里,那永远都不会有外部链接。

内部链接常指一个程序文件中全局变量,可以被程序文件内各个子程序访问,这在编译过程中处理,和link阶段不发生关系。如果变量前加了static,那么它永远不会被外部程序访问,它不会被编译程序写入目标代码的链接区。

无链接,就是在一个单体程序里,比如一个子程序,定义一个变量只给这个程序段用,那就是无链接。编译器和link都不需要对这样的变量做跨程序段的地址链接,这样的变量都是直接分配寄存器或者近堆中的直接地址(每个子程序都有自己的基本存储空间,被调用时得到分配,返回时被释放,我习惯叫它近堆,标准叫啥早不记得了)。

变量是这样,程序代码段也大体差不多。每次在程序文件中调用一个文件内部的子程序,就产生一个内部链接;如果调用外部文件中的子程序,就产生一个外部链接。只有没有任何子程序,所有代码都写在一个文件里的程序,才是无链接程序。

链接是个编译和link层面的概念,所以不仅限于变量层面讨论。

对了,再延伸,可以把一些子程序文件归类,程序执行某部分任务才访问,其他时间不访问时,可以生成DLL。在程序执行那部分功能时,通过操作系统和DLL建立动态链接,当然这是外部链接,这也是程序设计中常用到的。这可以避免生成一个巨大的EXE,运行时吃掉过多的系统资源,还可以实现这个DLL中包含的子程序在操作系统级和其他程序共用。

C++多文件程序,编译的时候没有问题,连接的时候提示有错误,怎么么解决?

unresolved external symbol "void __cdecl getVolumn(void)" (?getVolumn@@YAXXZ)。

unresolved external symbol "void __cdecl inputVolumn(void)" (?inputVolumn@@YAXXZ)

翻译过来就是 :

无法解析外部符号"void __cdecl getVolumn(void)" (?getVolumn@@YAXXZ)。

无法解析外部符号 "void __cdecl inputVolumn(void)" (?inputVolumn@@YAXXZ)

意思就是连接器链接的时候找不到全局函数void getVolumn()和void inputVolumn()的定义,出现这个问题的原因有:

函数没在某个实现文件里定义

函数定义了但是其连接性为内部链接(static inline关键字可能导致内部链接),所以连接器看不到定义。

解决方案:检查以上两个全局函数是否定义函数体, 检查函数定义的链接性是否正确。

C语言里面"具有外部链接的静态变量"这里的"链接"是什么意思?

首先从静态变量说起. C语言里面静态变量有三种: 分别是外部链接性,内部链接性和无链接性.

声明外部链接的变量的方法是在代码块外面声明它. 此变量是全局变量,多文件中亦可用.

声明内部链接的变量的方法是在代码块外面声明它并加上static限定符. 此变量是全局变量,但仅在本文件中可用.

声明无链接的变量的方法是在代码块里面声明它并加上static限定符. 此变量是局部变量,但仅在本代码块中可用.

例:

#include...........

int global=1; //声明外部链接的变量

static int global2 //声明内部链接的变量

int func()

{

int global=5; //声明的内部变量和全局变量重名,调用时将会隐藏全局的global;

coutglobal; //是内部定义的global的值而不是外面的值.

//如何引用外面的变量呢???

cout::global; //可用作用域解析符(::)来说明你要输出的外面的全局变量.

static int global3; //声明无链接的变量

}

int main()

{

extern int alobal; //在本文件中此句可选.此句的意思为你需要引用外部的变量global;

global=8; //直接引用全局变量.

}

望采纳!!!!

c语言中函数默认存储类型是什么

c语言中的存储类型有static 、auto、extern、及register,函数默认的存储类型应该是extern,意思是具有外部链接性的。一般来说,会通过extern来声明函数。比如下面的代码,在1.c中定义一个函数,函数的声明写在1.h头文件中,在2.c中通过添加1.h的头文件,来声明及调用函数f()。

//1.c

void f() { ; }

//1.h

extern void f();

//2.c

#include "1.h"

int main() { f();}


网站名称:c语言函数链接性 c语言互相关函数
分享网址:http://mswzjz.cn/article/doosdsi.html

其他资讯