首页 > 其他分享 >c语言中的链接属性和存储类型

c语言中的链接属性和存储类型

时间:2023-04-25 18:45:36浏览次数:37  
标签:存储 变量 int void 函数 extern 链接 属性

链接属性

external属性:

不在代码块中的函数和变量在缺省情况下都属于external链接属性。
具有external属性的变量或者函数在其他源文件中无论被包含多少次,都指向同一个实体。

#a.c                                     
int x;                                   

------------------------------------------------------------------------------------------------

#b.c
int main(void)
{
    extern int x;
    printf("%d",x);
}


extern关键字

具有external属性表示对外部文件可见,在b.c中通过extern int x 声明变量x来使用a.c中的x变量 。

注意:
1.如果在多个文件中有同名的链接属性为extern的变量,编译器在链接的时候会报错变量重复定义。
2.extern int y,使用了不存在的外部变量,编译器在链接的时候会报错变量未定义。

#a.c                                     
int x;                                   

------------------------------------------------------------------------------------------------

#b.c
int main(void)
{
    extern int y;
    printf("%d",y);
}


变量或函数允许多次声明,但只允许一次定义。
对于变量凡是没有带 extern 的声明同时也都是定义。
而对函数而言,带有{}是定义,否则是声明。








存储类型

存储类定义 C 程序中变量/函数的的存储位置、生命周期和作用域。

  1. auto
  2. static
  3. register
  4. extern



image


auto:
存储位置:内存栈区
生命周期:函数开始时创建,函数结束时销毁 。
作用域:函数内部。
注意:auto关键字只能修饰局部变量,当局部变量存储类型缺省时,该变量的存储类型就是auto,所以一般不显式声明auto。




static:
存储位置:静态区或常量区(.rodata段)
如果是const修饰的放在常量区,非常量放在静态区(已初始化的在.data段,未初始化的在.bss段)
生命周期:程序的整个生命周期内,不会因为进入或者离开他的作用域而创建或者销毁。
作用域:static修饰局部变量在代码块内有效,修饰全局变量在文件内有效。
注意:static修饰的变量只会初始化一次。

#include <stdio.h>
 
/* 函数声明 */
void func1(void);
 
static int count=10;        /* 全局变量 - static 是默认的 */
 
int main()
{
  while (count--) {
      func1();
  }
  return 0;
}
 
void func1(void)
{
/* 'thingy' 是 'func1' 的局部变量 - 只初始化一次
 * 每次调用函数 'func1' 'thingy' 值不会被重置。
 */                
  static int thingy=5;
  thingy++;
  printf(" thingy 为 %d , count 为 %d\n", thingy, count);
}




register:
存储位置:可能位于寄存器,也可能在内存中,这取决于硬件和实现的限制。
生命周期:函数开始时创建,函数结束时销毁 。
作用域:函数内部。
注意:register修饰变量只能是局部变量。





extern:
存储位置:静态区或常量区(.rodata段)
静态区中分为.data段和.bss段,(已初始化的在.data段,未初始化的在.bss段)
生命周期:程序的整个生命周期内 。
作用域:由extern声明的位置决定。
注意:当使用 extern 关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义。

#a.c
int x = 10;
-------------------------------------------------------------------------------------------------
#b.c
#include <stdio.h>

int main(void)
{

    extern int x;
    printf("x中x = %d",x);


}
void hello(void)
{
    /*
    *x在此函数中不能访问,x变量的作用域只在声明他的代码块 内有效  
    */
    x = 10;
}

标签:存储,变量,int,void,函数,extern,链接,属性
From: https://www.cnblogs.com/ljq245055804/p/17353519.html

相关文章

  • java8 lambda 求list最大值、最小值、平均值、求和、中位数、属性排序(空指针异常,空值
    点击查看代码importorg.junit.Test;importjava.text.SimpleDateFormat;importjava.util.*;importjava.util.stream.Collectors;importstaticjava.util.Comparator.comparingLong;importstaticjava.util.stream.Collectors.*;/***@Author:*@Date:2018/12......
  • P.13-用户密码加密存储密码、P.14-铺垫知识jwt工具类使用、P.15-登录接口实现细节分析
    P.13-用户密码加密存储密码实际项目中我们不会把密码明文存储在数据库中。默认使用的PasswordEncoder要求数据库中的密码格式为:{id}password。它会根据id去判断密码的加密方式。但是我们一般不会采用这种方式。所以就需要替换PasswordEncoder。我们一般......
  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • [软件下载] 常用软件安装包链接-阿里云盘
    1、Typora导出文件安装包Pandoc2、JDK1.53、JDK174、redis客户端工具RedisDesktopManager5、数据库链接工具DBeaver6、Typora带序列号破解7、ApiPost接口测试工具8、IDEA2021+破解工具 ......
  • 开关电源中变压器次级线圈链接的二极管叫什么?自由轮二极管Free-Wheeling Diode或者反
    “自由轮二极管”(Free-WheelingDiode)和“反并二极管”(FlybackDiode)这两个词汇都是出自电气工程领域,与开关电源和变压器等相关的电路设计有关。“自由轮二极管”一般用于开关电源中,当负载电流为零时,开关管需要关闭,此时,变压器的磁场崩溃,产生能量,自由轮二极管用来消除变压器次级中......
  • ceph-san跨存储迁移指导文档
    CEPH-SAN存储后端迁移指导文档确认需要进行虚拟机的UUID和宿主机节点当前宿主机节点为FZHZ4-TSTACK-COM05确认该宿主机节点是否对接FCSAN对接SAN后需要满足以下条件才可进行跨存储迁移1).HBA卡要插线,确认有端口速率2).在SAN存储上添加映射关系3).SAN交换机zone要划分正取可......
  • C语言的5种存储类以及关键字volatile、restrict
    《CPrimerPlus》读到12章,我的C语言复习进展的挺不错。这一章介绍存储类、连接和内存管理,可以说是重中之重。C的5种存储类:自动——在一个代码块内(或在一个函数头部作为参量)声明的变量,无论有没有存储类修饰符auto,都属于自动存储类。该类具有自动存储时期、代码块的作用域和空链接(n......
  • elf文件格式与动态链接库(非常之好)-----不可不看
                elf文件格式与动态链接库(非常之好)-----不可不看机器执行的是机器指令,而机器指令就是一堆二进制的数字。高级语言编写的程序之所以可以在不同的机器上移植就因为有为不同机器设计的编译器的存在。高级语言的编译器就是把高级语言写的程序转换成某个......
  • 群晖NAS挂载AWS S3存储桶
    前言NAS上本身有很多备份同步套件,云存储用的比较多的是cloudsync,如图,支持多家厂商的云存储同步备份[cloudsync套件](https://s2.51cto.com/images/202304/e55ae77638eedf0dedc620be491d61f141a136.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF......
  • 虚拟存储管理中几种缺页中断算法计算逻辑
    题目一:在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的页面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为多少,采用LRU调度算法产生的缺页中断数为多少?解析:FIFO调度算法:先进先出原则,当内存中存在,则......