static 修饰的全局变量具有内部链接的一个例子

2023-05-16

很久不能明白这个事情,下面自己来举个例子吧:

文件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(使用前将#替换为@)

static 修饰的全局变量具有内部链接的一个例子 的相关文章

随机推荐