链接属性

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

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语言中的链接属性和存储类型的更多相关文章

  1. C语言作用域、链接属性和存储类型

    C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...

  2. C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static

    1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...

  3. C语言中的作用域,链接属性和存储类型

    作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间 ...

  4. 关于extern和static关键字引出的一些关于作用域和链接属性和存储类型的问题

    在进入正题前我们必须了解一些概念: 标识符:标识符不仅仅代表着变量的名字,main()函数的main也是一个标识符,这点很重要. 存储类型:即变量的存储位置及其生存周期:静态区:分为两块 .date ...

  5. C语言中【变量】的存储类型共有4种类型

    在C语言中,对变量的存储类型说明有以下四种:   auto          自动变量 (动态存储) register     寄存器变量(动态存储) extern       外部变量(静态存储) ...

  6. C语言中的作用域、链接属性与存储属性

    C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...

  7. c语言3种链接属性: 外部(external), 内部(internal),无设置(none)

    c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?    c语言中有3种链接属性: 外部(external), 内部(internal),无设置(none)    外部( ...

  8. C语言学习笔记--C语言中变量的属性关键字

    变量属性关键字的使用语法:property type var_name; 1.auto 关键字 auto关键字是C语言中局部变量的默认的关键字,C编译器默认所有的局部变量都是auto的,它表明了被修饰 ...

  9. C中的链接属性及作用域

    如果相同的标识符出现在几个不同的源文件中时,它们是表示相同的实体,还是不同的实体.标识符的链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域与它的链接属性有关. 链接属性一般有三种:exte ...

  10. C#语言中字段和属性相关知识剖析

    针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...

随机推荐

  1. .net core 版本避坑 无法打开项目文件。 无法找到 .NET SDK。请检查确保已安装此项且 global.json 中指定的版本(如有)与所安装的版本相匹配。

    打开项目根目录,输入 dotnet --version  ,查看本机安装的最高版本的sdk: 如果源文件中存在global.json文件,直接打开修改即可: 不存在则接着在1步骤后输入: dotnet ...

  2. SQL SERVER 2014 双机热备操作流程-数据库双向同步 (第一篇:发布)

    需求:需要两个数据库双向同步,即A数据库变动,B及时更新.B数据库变动,A及时更新.思路:利用SQL Server的发布和订阅功能进行同步,在A数据库进行发布<合并发布>,在B数据库进行订 ...

  3. 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 ...

  4. 9. PEP8规范

    1. 每一级缩进4个空格 2. 续行时缩进要比正常行多缩进, 要能明显看出是续行的 3. 每一行最多79个字符 4. 函数和类定义时在前后加2个空行, 类内接口在定义时, 前后加1个空行 5. 二元运 ...

  5. 内网jenkins跨版本升级

    概要: 原来使用的jenkins版本为1.6,现在需要升级为最新版2.3.6 由于在内网,不能使用jenkins自带的在线升级工具 升级思路: 由于版本跨度太大,直接copy jenkins目录,启动 ...

  6. BOW/DOM(上)

    BOM 原生对象:成为js中的内置对象,就是由 js 中的构造函数创建的对象就被称为原生对象:Object.Number.Array.Date.String.... 宿主对象:web运行环境,也就是w ...

  7. Springboot 结合 Netty 实战聊天系统

    音视频技术为什么需要微服务 微服务,英文名:microservice,百度百科上将其定义为:SOA 架构的一种变体.微服务(或微服务架构)是一种将应用程序构造为一组低耦合的服务. 微服务有着一些鲜明的 ...

  8. 【单元测试】Junit 4(六)--junit4测试优先级顺序

    ​ @FixMethodOrder的顺序也并不一定是方法在代码中定义的顺序,这与JVM的实现有关. ​ 我们在写JUnit测试用例时,有时候需要按照定义顺序执行我们的单元测试方法,比如如在测试数据库相 ...

  9. 能让Java开发者提高效率的10个工具

    ​ Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言.最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求. 无论你是否拥有一家科技公司,软件已经成为几乎每一个企业不可或缺的 ...

  10. java选择结构-if

    java选择结构-if if单选泽结构 if双选择结构 if多选择结构 if嵌套结构 package charpter2; import com.sun.xml.internal.ws.address ...