C语言中变量和函数的作用域和链接属性

作用域

  1. 代码块作用域: 代码块指的是使用“{}”包围起来的部分。

    1. 在代码块中定义的变量,代码块之外是不能访问的。
    2. 代码块嵌套之后的变量作用域,子代码块中定义的同名变量会覆盖父代码块中的同名变量。
    3.  #include <stdio.h>
      int main(){
      {
      int i=0;
      printf("%d\n",i);//0
      {
      int i=1;
      printf("%d\n",i);//1
      }
      }
      }
  2. 函数原型作用域: 函数原型作用域仅包括函数原型形式参数所在的括号。该作用于主要强调声明函数时不能使用相同名称的形式参数。

  3. 函数作用域: 函数作用域指的就是函数体的部分。K&R C的函数体不包含函数参数,所以在函数体内定义和函数参数同名变量会替代函数参数。ANSI C修改了该问题,函数参数在函数体的最外层作用域之内。

    1. 函数作用域内定义的变量,在函数之外不能进行访问。
  4. 文件作用域: 源文件所在的范围。

    1. 所有代码块之外定义的标识符就有文件作用域。(全局变量)
    2. 函数名不属于任何任何代码块,因此也具有文件作用域。

链接属性

  • 当组成一个程序的所有源文件被编译之后,所有目标文件以及那些从一个或多个函数库中引用的函数链接在一起,组成可执行文件。问题是当相同的标识符出现在不同的源文件时该怎么办?标识符的链接属性用来处理不同源文件中出现的标识符。标识符的链接属性和它的作用域有关但并不相同。
  1. none(无): 总是被当做单独个体,也就是说该标识符在不同源文件中的多次声明之间毫无关系,分属不同的实体。

    1. 代码块之内定义的变量默认具有none连接属性。通过extern修饰符可以修改为外部链接属性,这样就可以访问其他源文件中定义的外部变量了。static修饰符不能修改连接属性和作用域,只修改存储类型。
      #include <stdio.h>
      int main(){
      {
      static int i=0;
      printf("%d\n",i);//0
      }
      printf("%d\n",i);//error: ‘i’ undeclared (first use in this function)
      }
  2. internal(内部): 在同一个源文件中的所有声明指向同一实体,不同源文件指向不同实体。全局变量和函数可以通过static修饰符从外部链接属性改为内部链接属性。

  3. external(外部):在所有源文件中指向同一实体。全局变量和函数默认具有全局作用域,可以通过extern将从未显式声明链接属性的标识符修改为外部链接属性。

    1. static关键字可以将全局变量和函数修改为内部连接属性。
    2. 全局变量默认为外部链接属性:
      main.c
      #include <stdio.h>
      int i;
      int main(){return 0;};
      test.c
      #include <stdio.h>
      int i=0;
      gcc -c main.c test.c //success
      gcc -o main main.o test.o //multiple definination of "i"
      main.c修改:
      #include <stdio.h>
      extern int i;//通过使用extern将该全局变量声明为外部链接属性,使用外部定义的变量。
      int main(){return 0;}
      gcc -o main main.o test.o //success
    3. 函数通过extern关键字修饰为全局连接属性,指的是该函数可能在其他源文件中进行定义。
      main.c
      #include <stdio.h>
      extern int printHello();//仅指明该函数是在外部函数中声明定义。
      int main(){
      printHello();
      return 0;
      }
      test.c
      #include <stdio.h>
      int printHello(){
      printf("hello\n");
      return 0;
      }

C语言中变量和函数的作用域和链接属性的更多相关文章

  1. c语言中变量和函数作用域深究

    首先,函数的作用域和访问权限基本可以参考 C语言中的作用域,链接属性和存储类型 也存在例外情况,比如内联函数 static inline,使用static 修饰 inline之后外部文件也可以访问内联 ...

  2. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  3. C语言中变量、全局变量与变量的作用域

    什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...

  4. C语言中变量的存储类型

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

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

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

  6. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  7. C语言中返回字符串函数的四种实现方法

    转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...

  8. C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  9. 关于javascript中变量及函数的提升

    javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...

随机推荐

  1. SQL Server有意思的数据类型隐式转换问题

    写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CRE ...

  2. 小程序npm(初级篇)

    小程序npm NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NP ...

  3. 使用VS Code开发纸壳CMS自动编译主题压缩CSS,JS

    Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GI ...

  4. Quasar framework 配置vue apollo

    Quasar 整合 vue-apollo 确保你已经知道quasar 和 vue apollo 在quasar中使用vue apollo客户端时出现的一点小问题 在quasar项目中使用vue-apo ...

  5. 控制label标签的宽度,不让它换行 label标签左对齐

    1==>控制label标签的宽度.解决字段名太长时,不会换行显示 label-width="100px" label标签的宽度是100px; style="widt ...

  6. phoenix中添加二级索引

    Phoenix创建Hbase二级索引 官方文档 1. 配置Hbase支持Phoenix创建二级索引   1.  添加如下配置到Hbase的Hregionserver节点的hbase-site.xml  ...

  7. Python程序中的线程操作-锁

    目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...

  8. 使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

    一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表 ...

  9. 1+x 证书 Web 前端开发中级理论考试(试卷 7 ) 答案

    1+x 证书 Web 前端开发中级理论考试(试卷 7 ) 答案 转载请注明来源:妙笔生花个人博客http://blog.zh66.club/index.php/archives/438/ 官方QQ群 ...

  10. vscode开发微信小程序使用less(插件Easy WXLESS)

    1.搜索按照Easy WXLESS 2.在文件中加入下面的一行代码:就会在同级目录下同步代码到.wss // out: index.wxss 更多的写法可以查官网:https://marketplac ...