首页 > 其他分享 >C语言中的强符号和弱符号

C语言中的强符号和弱符号

时间:2022-12-06 22:55:17浏览次数:65  
标签:10 gdata 符号 C语言 func 全局变量 链接

摘自:https://blog.csdn.net/ASJBFJSB/article/details/81267934

一、强弱符号

强弱符号针对的是处于同一工程下在不同源文件下定义的全局变量符号,链接器只处理global的符号而不处理local的符号。链接的核心是符号的重定位,在符号引用的地方找到符号定义的地方,包括函数产生的符号和全局变量产生的符号。

强符号:函数和初始化的全局变量所生成的符号。
弱符号:未初始化的全局变量所生成的符号。

很多情况下写出的代码会出现链接的错误,符号重定义,这是因为在不同的源文件中定义了同名的全局变量并且都进行了初始化。

//a.c
int gdata = 10;
//b.c
int gdata = 20;
#include<stdio.h>
int main(){
printf("gdata = %d\n",gdata);
return 0;
}

这是很多新手容易犯的错误,若将a.c或b.c中全局变量gdata只初始化一次,则不会出现链接错误,并且会链接成功。那么新的问题是:
(1)出现强符号和弱符号,选择哪一个?
(2)若出现多个同名的强符号,最终怎么选择?
(3)若出现多个同名的弱符号,最终会怎么选择?
显然需要这样的一套规则来约束这些可能存在的问题。

二、强弱符号的使用规则

(1)如果出现多个强符号,最终会出现链接错误即符号的重定义。
(2)如果出现强符号和弱符号,编译器最终会选择强符号。
(3)如果出现多个同名弱符号,编译器最终会选择内存占用量最大的那个符号。

一个有趣的小例子再看强弱符号:

//a.c
int x;
void func(){
x = 20;
}
//b.c
#include<stdio.h>
short x = 10;
short y = 10;
extern void func();
int main(){
func();
printf("x = %d,y = %d\n",x,y);
return 0;
}
//试问输出的x和y分别是多少,大家可以自己先想一下,看看自己的答案。

执行结果:

和大家心中的答案是否一致呢?
有很多人会有疑问,为什么y输出的不是10,而是0呢?
源文件是独立进行编译的

//a.c
int x;//弱符号
void func(){
x = 20; //往x的内存上写20,写4个字节 编译阶段就完成的
}
//b.c
#include<stdio.h>
short x = 10;//强符号 14 00 00 00最终将y覆盖为0
short y = 10;
extern void func();
int main(){
func();//链接的完成选择强符号
printf("x = %d,y = %d\n",x,y);
return 0;
}

标签:10,gdata,符号,C语言,func,全局变量,链接
From: https://www.cnblogs.com/LiuYanYGZ/p/16961682.html

相关文章

  • 喝汽水--C语言
    题目名称:喝汽水问题题目内容:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程)分析:1.20元能喝20瓶2.2个空瓶能换1瓶汽水,剩下的空瓶:empty/2+empty%代码方法1:#inc......
  • 二叉树入门到进阶(下一篇讲红黑树)——c语言刷题合集
    目录二叉树概念二叉树的遍历方式DFS(前序中序后序遍历)144.二叉树的前序遍历递归解法迭代解法94.二叉树的中序遍历145.二叉树的后序遍历层序遍历--队列的作用102.二叉......
  • C语言学习入门 (八) 结构体和枚举
    结构体它允许内部的元素是不同类型的结构体的定义//结构体类型:struct{charintfloat};//定义一个结构体变量,定义变量时才分配存储空间structPersonstructchar *name;int}......
  • C语言学习入门 (二) 语句和运算符
    C语言的基本语句跟Java中的差不多循环语句(dowhile、while、for)条件语句(if 、if-else、switch)goto语句 (比如在循环外定义一个标记Exit:; 在循环内可以用gotoExit;......
  • c语言实现乘法口诀
    #include<stdio.h>intmain(void){inti,j;for(j=1;j<10;j++)for(i=1;i<10;i++){if(i<j){if((i==2)......
  • 单片机C语言C51的语句
    1. if语句if语句是C51中的一个基本条件选择语句,它通常有三种格式:(1)if(表达式){语句;}(2)if(表达式){语句1;} else {语句2;}(3)if(表达式1){语句1;}else if(表达式2)(语句2;)else......
  • 数据结构(C语言版)
    数据结构(C语言版)作者:李云清 杨庆红 揭安全出版社:人民邮电出版社 一、概论1.1数据结构的基本概念与术语1.2数据类型和抽象数据类型1.3算法和算法分析1.4......
  • C语言第二课学习笔记--运算符,流程控制和函数
    <7>运算符1)分类:一些基本的运算符分类有:算术、关系、逻辑、赋值算术运算符有:+,-,*,/,%;    对于/被除数和除数都是int则结果是int,有一个是float结果就是float;对于%,被......
  • C语言从入门到实战(基础学习篇)
    1.基本数据类型原码反码和补码正数的反码是其本身负数的反码是在其源码的基础上,符号位不变,其余各个位取反负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+11.......
  • 高级语言程序设计(c语言版)
    高级语言程序设计(c语言版)  ——基于计算思维能力培养作者:揭安全出版社:人民邮电出版社 一、程序设计引论1.1计算科学与问题求解1.2程序与程序设计1.3程序......