扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这部分内容是在程序的编译和link层面谈的。
成都创新互联是一家专注于成都网站设计、成都做网站与策划设计,隆林网站建设哪家好?成都创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:隆林等地区。隆林做网站价格咨询:18980820575
一个大一些的工程往往不是只有一个程序文件,经常由好多C程序文件构成,有的时候里面个别程序可能还用的其他语言,编码完成后常常分别编译,编译完成再link到一起。某个C程序需要用到其他程序中定义过的变量,一般都加extern前缀,编译时编译器会预留访问链接的空位,等到link阶段再在整个工程的其他C编译结果中去对号,把访问链接填上。这就是外部链接。如果你程序全写在一个文件里,那永远都不会有外部链接。
内部链接常指一个程序文件中全局变量,可以被程序文件内各个子程序访问,这在编译过程中处理,和link阶段不发生关系。如果变量前加了static,那么它永远不会被外部程序访问,它不会被编译程序写入目标代码的链接区。
无链接,就是在一个单体程序里,比如一个子程序,定义一个变量只给这个程序段用,那就是无链接。编译器和link都不需要对这样的变量做跨程序段的地址链接,这样的变量都是直接分配寄存器或者近堆中的直接地址(每个子程序都有自己的基本存储空间,被调用时得到分配,返回时被释放,我习惯叫它近堆,标准叫啥早不记得了)。
变量是这样,程序代码段也大体差不多。每次在程序文件中调用一个文件内部的子程序,就产生一个内部链接;如果调用外部文件中的子程序,就产生一个外部链接。只有没有任何子程序,所有代码都写在一个文件里的程序,才是无链接程序。
链接是个编译和link层面的概念,所以不仅限于变量层面讨论。
对了,再延伸,可以把一些子程序文件归类,程序执行某部分任务才访问,其他时间不访问时,可以生成DLL。在程序执行那部分功能时,通过操作系统和DLL建立动态链接,当然这是外部链接,这也是程序设计中常用到的。这可以避免生成一个巨大的EXE,运行时吃掉过多的系统资源,还可以实现这个DLL中包含的子程序在操作系统级和其他程序共用。
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语言里面静态变量有三种: 分别是外部链接性,内部链接性和无链接性.
声明外部链接的变量的方法是在代码块外面声明它. 此变量是全局变量,多文件中亦可用.
声明内部链接的变量的方法是在代码块外面声明它并加上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语言中的存储类型有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();}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流