c语言中的链接属性和存储类型
链接属性
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 程序中变量/函数的的存储位置、生命周期和作用域。
- auto
- static
- register
- extern
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;
}
c语言中的链接属性和存储类型的更多相关文章
- C语言作用域、链接属性和存储类型
C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...
- C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static
1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...
- C语言中的作用域,链接属性和存储类型
作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间 ...
- 关于extern和static关键字引出的一些关于作用域和链接属性和存储类型的问题
在进入正题前我们必须了解一些概念: 标识符:标识符不仅仅代表着变量的名字,main()函数的main也是一个标识符,这点很重要. 存储类型:即变量的存储位置及其生存周期:静态区:分为两块 .date ...
- C语言中【变量】的存储类型共有4种类型
在C语言中,对变量的存储类型说明有以下四种: auto 自动变量 (动态存储) register 寄存器变量(动态存储) extern 外部变量(静态存储) ...
- C语言中的作用域、链接属性与存储属性
C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...
- c语言3种链接属性: 外部(external), 内部(internal),无设置(none)
c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢? c语言中有3种链接属性: 外部(external), 内部(internal),无设置(none) 外部( ...
- C语言学习笔记--C语言中变量的属性关键字
变量属性关键字的使用语法:property type var_name; 1.auto 关键字 auto关键字是C语言中局部变量的默认的关键字,C编译器默认所有的局部变量都是auto的,它表明了被修饰 ...
- C中的链接属性及作用域
如果相同的标识符出现在几个不同的源文件中时,它们是表示相同的实体,还是不同的实体.标识符的链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域与它的链接属性有关. 链接属性一般有三种:exte ...
- C#语言中字段和属性相关知识剖析
针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...
随机推荐
- .net core 版本避坑 无法打开项目文件。 无法找到 .NET SDK。请检查确保已安装此项且 global.json 中指定的版本(如有)与所安装的版本相匹配。
打开项目根目录,输入 dotnet --version ,查看本机安装的最高版本的sdk: 如果源文件中存在global.json文件,直接打开修改即可: 不存在则接着在1步骤后输入: dotnet ...
- SQL SERVER 2014 双机热备操作流程-数据库双向同步 (第一篇:发布)
需求:需要两个数据库双向同步,即A数据库变动,B及时更新.B数据库变动,A及时更新.思路:利用SQL Server的发布和订阅功能进行同步,在A数据库进行发布<合并发布>,在B数据库进行订 ...
- MySQL 导出数据结构 If you don't want to restore GTIDs, pass --set-gtid-purged=OFF.
应用场景MYSQL导出数据结构 Warning: A partial dump from a server that has GTIDs will by default include the GTI ...
- 9. PEP8规范
1. 每一级缩进4个空格 2. 续行时缩进要比正常行多缩进, 要能明显看出是续行的 3. 每一行最多79个字符 4. 函数和类定义时在前后加2个空行, 类内接口在定义时, 前后加1个空行 5. 二元运 ...
- 内网jenkins跨版本升级
概要: 原来使用的jenkins版本为1.6,现在需要升级为最新版2.3.6 由于在内网,不能使用jenkins自带的在线升级工具 升级思路: 由于版本跨度太大,直接copy jenkins目录,启动 ...
- BOW/DOM(上)
BOM 原生对象:成为js中的内置对象,就是由 js 中的构造函数创建的对象就被称为原生对象:Object.Number.Array.Date.String.... 宿主对象:web运行环境,也就是w ...
- Springboot 结合 Netty 实战聊天系统
音视频技术为什么需要微服务 微服务,英文名:microservice,百度百科上将其定义为:SOA 架构的一种变体.微服务(或微服务架构)是一种将应用程序构造为一组低耦合的服务. 微服务有着一些鲜明的 ...
- 【单元测试】Junit 4(六)--junit4测试优先级顺序
@FixMethodOrder的顺序也并不一定是方法在代码中定义的顺序,这与JVM的实现有关. 我们在写JUnit测试用例时,有时候需要按照定义顺序执行我们的单元测试方法,比如如在测试数据库相 ...
- 能让Java开发者提高效率的10个工具
Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言.最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求. 无论你是否拥有一家科技公司,软件已经成为几乎每一个企业不可或缺的 ...
- java选择结构-if
java选择结构-if if单选泽结构 if双选择结构 if多选择结构 if嵌套结构 package charpter2; import com.sun.xml.internal.ws.address ...
