很久不能明白这个事情,下面自己来举个例子吧:
文件1.c
#include <stdio.h>
extern int s;
int main()
{
printf("%d\n",s);
return 0;
}
文件2.c
int s = 1234;
这里s是定义在2.c中的,如果1.c中只要进行外部变量声明,即如下:
extern int s;
那么1.c就可以使用2.c中的变量s,当然,编译的时候需要2个文件一起编译,在gcc中执行如下指令:
gcc 1.c 2.c -o outputfile
outputfile就是一个可执行文件了。运行结果如下:
1234
之所以1.c能使用2.c中的变量,就是因为2.c中的变量s具有外部链接(全局变量默认是外部链接的),但是如果在2.c中的s定义的时候前面加了static,那么2.c中的s就是内部链接的了(static会改变全局变量的链接),那么结果会怎么呢?结果是:1.c不能使用s了,如下:
文件2.c
int s = 1234;
文件1.c
#include <stdio.h>
extern int s;
int main()
{
printf("%d\n",s);
return 0;
}
然后1.c和2.c一起编译,下面是我在gcc编译器中进行编译:
gcc 1.c 2.c -o outputfile
执行上述编译指令后,出现如下错误:
/usr/bin/ld: /tmp/cctCoYse.o: warning: relocation against `s' in read-only section `.text'
/usr/bin/ld: /tmp/cctCoYse.o: in function `main':
1.c:(.text+0xa): undefined reference to `s'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
英文看不懂,反正是不能使用了。
补充:下面是自己在网上找到的一篇文章,虽然云里雾里的,但是仔细体会,还是能体会到一些知识:
C 中与 static 关键字的内部链接
[英] Internal linkage with static keyword in C
本文介绍了C 中与 static 关键字的内部链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我知道 static
是 C 中的一个重载关键字.在这里,我只对它作为关键字来强制执行内部链接感兴趣.
如果您在 .c
文件中声明了一个全局变量,使用 static
和不使用 static
有什么区别?无论哪种方式,没有其他 .c
文件可以访问该变量,因此该变量基本上对文件来说是私有的",无论是否带有 static 关键字.
例如,如果我有一个文件 foo.c
,并且我声明了一个全局变量:
int x = 5;
那个变量 x
仅可用于 foo.c
内的代码(当然,除非我在某些共享头文件中使用 extern
声明它)> 关键字).但是如果我不在头文件中声明它,如果我要输入会有什么不同:
static int x = 5
.
无论如何,x
似乎在这里有内部联系.所以我对 static
在这方面的目的感到困惑.
推荐答案
如果您在 .c
文件中声明了一个全局变量,使用 static
和不使用 static
有什么区别?无论哪种方式,没有其他 .c
文件可以访问变量 [...]
一个不同的文件可以声明 x
:
extern int x;
这将允许编译引用 x
的代码,然后链接器会很高兴地将这些引用链接到它找到的任何 x
.
static
通过防止 x
在其翻译单元之外可见来防止这种情况.
这篇关于C 中与 static 关键字的内部链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)