C语言中的作用域,链接属性和存储类型
作用域
当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域
1.代码块作用域:位于一对花括号之间的所有语句称为一个代码块.任何在代码块的开始位置声明的标识符都具有代码块作用域,表示他可以被这个代码块中的所有语句访问.(例子中:f,g函数,i)
2.文件作用域:任何在所有代码块之外声明的标识符都具有文件作用域,他表示这些标识符从他们的声明之处直到他所在的源文件结尾处都是可以访问的.(例子中:a,b)
3.原型作用域:原型作用域只适用于在函数原型中声明的参数名.(例子中:c,h)
4.函数作用域:表示一个函数中的作用域.
例子:
int a;
int b(int c);
int d (int e){
int f:
int g(int h);
...
{
int f,g,i;
}
{
int i;
}
}
链接属性
当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或者多个函数库中引用的函数链接在一起,形成可执行程序,如果相同的标识符出现在几个不同的源文件中.标识符的链接属性决定如何处理这些标识符.
链接属性一共有三种:external(外部),internal(内部)和none(无).
1.none:没有链接属性的标识符(none)总是被当做单独的个体.
2.internal:标识符在同一个源文件内的所有声明都指同一个实体,但位于不同源文件的多个声明则分属于不同实体
3.external:标识符不论声明多少次,位于几个源文件都表示同一个实体.
例子:
typedef char *a;
int b;
int c(int d){
int e;
int f(int g);
}
默认情况下:b,c,f的链接属性为external,其余标识符为none.
关键字extern和static用于在声明中修改标识符的链接属性.如果在默认是external属性前加上static,可以使他的属性变为internal.
比如上述 static int b;和static int c(int d)就变成这个源文件私有,不能被其他文件访问.
static只对默认属性为external的声明才有效果,对默认是none的效果完全不一样.
extern可以吧none属性的标识符变为external属性.
比如上述extern int e修改之后可以使用其他源文件的e标识符
存储类型
在程序中,变量存储类型决定他何时创建,何时销毁,以及他的值保持多久.有三个地方可以用于存储变量:普通内存,运行时堆栈,硬件寄存器.
普通内存:凡是在任何代码块之外声明的变量总是存储于静态内存中.这类变量称为静态变量,这类变量在程序启动时创建,终止时销毁.
运行时堆栈:在代码块内部声明的变量的默认存储类型是自动的,称为自动变量.如果在代码块内部声明的变量前面加上static,这个变量的存储类型就改变为静态,程序运行中一直存在
硬件寄存器:使用关键字register声明的变量表示寄存器变量,保存在硬件的寄存器中.他只能对自动变量声明
C语言中的作用域,链接属性和存储类型的更多相关文章
- C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static
1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...
- C语言作用域、链接属性和存储类型
C/C++中作用域详解 作用域 编译器可以确认的4种作用域-代码块作用域.文件作用域.函数作用域和原型作用域,一般来说,标识符(包括变量名和函数名)声明的位置决定它的作用域. (1)代码块作用域 一对 ...
- 关于extern和static关键字引出的一些关于作用域和链接属性和存储类型的问题
在进入正题前我们必须了解一些概念: 标识符:标识符不仅仅代表着变量的名字,main()函数的main也是一个标识符,这点很重要. 存储类型:即变量的存储位置及其生存周期:静态区:分为两块 .date ...
- C语言中的作用域、链接属性与存储属性
C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...
- Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针)
the-way-to-go_ZH_CN/07.1.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...
- 在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:
在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句: 如果是String类型的字符串进行判空的时候: <if test=&q ...
- C/C++语言中变量作用域:局部变量,全局变量,文件级变量
C/C++语言中的变量分为全局变量和局部变量. 这样的划分方式的根据是变量的可见范围或者叫做作用域. 1 局部变量 局部变量指的是定义在{}中的变量,其作用域也在这个范围内.尽管常见的局部变量都是定义 ...
- 在Delphi中调用"数据链接属性"对话框设置ConnectionString
项目需要使用"数据链接属性"对话框来设置ConnectionString,查阅了一些资料,解决办法如下: 1.Delphi 在Delphi中比较简单,步骤如下: 方法1: use ...
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
随机推荐
- 在github上参与开源项目贡献代码
1 登录github, 点击自己感兴趣的repository的fork按钮,这样自己的github主页会有一个拷贝. 2 在自己本地修改同时保持和原来的repository同步: git remote ...
- [Leetcode 108]有序数组转二叉搜索树Convert Sorted Array to Binary Search Tree
[题目] 给出的升序排序的数组,个数必为奇数,要求形成二叉搜索(平衡)树. [思路] 辅助函数fun,[0,len]=>[0,mid-1]+[mid+1,len]. 当left>right ...
- Linux之expr命令详解
expr命令: expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串. –格式为: expr Expression(命令读入Expressi ...
- 3 第一个Django应用 第2部分(管理站点)
Django会根据你写的模型文件完全自动地生成管理界面. 管理界面不是让访问网站的人使用的,它服务于网站管理者. 它用于网站的管理员. 3.1创建一个管理员用户 3.2进入管理站点 3.3管理站点的功 ...
- like contains
like : %/% = *****/**** contains: abc = 字符串中含有 abc
- 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象
学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...
- C++内存管理-new,delete,new[],placement new的简单使用
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 首先,我们先看一下C++应用程序,使用memory的途径如下图所示 C++应用程序中申请内存基于分配器的实现(std::allo ...
- ARTS(一)
ARTS第一周,2019年3月17日,星期日,天气晴. A:算法学习(Algorithm) 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LE ...
- Java面试通关秘籍汇总集
一.基础篇 1.1.Java基础 面向对象的特征:继承.封装和多态 final, finally, finalize 的区别 Exception.Error.运行时异常与一般异常有何异同 请写出5种常 ...
- 【转】使用Mybatis时遇到的延迟加载造成返回异常的问题——HttpMessageConversionException: Type definition error
在使用Mybatis的过程中,使用了resultMap延迟加载. 延迟加载:association联表查询的过程中,查询另外两个表的对象.而延迟加载是指只有在使用这两个对象的时候才会进行查询. 问题的 ...