强弱符号

在c语言中:
强符号:有初始化的就是强符号
弱符号:未初始化的就是弱符号
1.如果在一个工程中出现同名的强符号,编译一定出错
2.如果出现同名的一个强符号一个弱符号,则不会报错,且使用的时候优先使用强符号
3.如果出现了多个同名的弱符号,则优先使用占用内存较大的符号

验证:
在同一个工程下建立两个.c文件,分别命名为test和main
main.c:

#include
short x = 10;   //强符号
short y = 10;

void fun();
int main()
{
	fun()
	print("x = %d,y = %d", x, y)
	return 0;
}

test.c:

int x;     //弱符号
void fun()
{
 x = 20;
 //将20 给x的内存上写4个字节,因为x是int型,一旦写进去不去修改内存中一直是20  四字节
}
//每个c文件在编译的时候是分开单独编译的,所以在test中,访问的是当前文件中x

执行结果:

x = 20,y = 0

解析:

test和mian是两个不同的源文件,在编译的时候,各自编译各自的,test.o  main.o
对于test.c而言:
编译器在编译的时候,只能看到它自己文件中的x,所以fun函数编译的时候其中的x使用的全局的弱符号 x,且为4个字节

但是链接的时候,是所有文件的一起链接,如果链接器链接的时候遇到比x弱符号强的强符号,就是用的是强符号即main.c中的x
那么问题来了,main中的x是short型,是2个字节,test中的x是4个字节
要让short型的x变量去绑定内存中的四字节的数,明显“超出管辖范围”
所以链接去了main中的x后它只能保存原来x中的2字节的内容

20  ----->  14  00  00  00   四字节,且为小端模式
short x    2字节 :拿到的是 14 00
short y    2字节 :拿到是   00  00   ,就把原来的y的值覆盖

注:这是较老版本的编译器执行的结果,新的编译器可能会是其他情况,
如y = 10,这是新版编译器的优化,不过不影响此问题的探究

c++中:
c++中我们不能在定义全局的同名的符号,因为无法知道使用的是哪个。

你可能感兴趣的:(C/C++基础,强弱符号)