设为首页 加入收藏

TOP

C的链接详解
2014-11-24 02:53:20 来源: 作者: 【 】 浏览:1
Tags:链接 详解

多目标文件的链接


stack.c


#include


#define STACKSIZE 1000


typedef struct stack {
int data[STACKSIZE];
int top;
} stack;


stack s;
int count = 0;


void pushStack(int d)
{
s.data[s.top ++] = d;
count ++;
}


int popStack()
{
return s.data[-- s.top];
}


int isEmpty()
{
return s.top == 0;
}


link.c


#include


int a, b;


int main()
{
a = b = 1;


pushStack(a);
pushStack(b);
pushStack(a);


while (! isEmpty()) {
printf("%d\n", popStack());
}

return 0;
}


编译方式:


gcc -Wall stack.c link.c -o main


提示出错信息如下:


C的链接详解


但是代码是可以执行的


定义和声明


static和extern修饰函数


上述编译出现错误的原因是:编译器在处理函数调用代码时没有找到函数原型,只好根据函数调用代码做隐式声明,把这三个函数声明为:


int pushStack(int);
int popStack(void);
int isEmpty(void);


编译器往往不知道去哪里找函数定义,像上面的例子,我让编译器编译main.c,而这几个函数定义却在stack.c里,编译器无法知道,因此可以用extern声明。修改link.c如下:


#include


int a, b;


extern void pushStack(int d);
extern int popStack(void);
extern int isEmpty(void);


int main()
{
a = b = 1;


pushStack(a);
pushStack(b);
pushStack(a);


while (! isEmpty()) {
printf("%d\n", popStack());
}

return 0;
}


这样编译器就不会报警了。这里extern关键字表示这个标识符具有External Linkage.pushStack这个标识符具有External Linkage指的是:如果link.c和stack.c链接在一起,如果pushStack在link.c和stack.c中都声明(在stack.c中的声明同时也是定义),那么这些声明指的是同一个函数,链接后是同一个GLOBAL符号,代表同一个地址。函数声明中的extern可以省略不写,不屑extern的函数声明也表示这个函数具有External Linkage。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python中OS模块的操作 下一篇Redis多库选择单例类

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: