首页 > 其他分享 >关于变量的声明和定义、内部函数和外部函数

关于变量的声明和定义、内部函数和外部函数

时间:2024-11-14 17:46:01浏览次数:1  
标签:文件 定义 外部 extern 声明 变量 函数

关于变量的声明和定义

一个函数一般由两部分组成:声明部分和执行语句。声明部分的作用:是对有关的标识符(如变量、函数、结构体、共用体等)的属性进行声明。对于函数而言,声明和定义的区别是明显的,函数的声明是函数的原型,而函数的定义是对函数功能的定义。对被调用函数的声明是放在主调函数的声明部分中的,而函数的定义显然不在声明部分的范围内的,它是一个独立的模块

对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:

  • 需要建立存储空间的,此为定义性声明,简称定义
  • 不需要建立存储空间的,此为引用性声明

广义的说,声明包括定义,但并非所有的声明都是定义。例如 int a;,既是声明,也是定义;而对extern a;而言,是声明而不是定义。一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。显然这里指的声明是狭义的,即非定义性声明。

外部变量定义和外部变量声明的含义是不同的。外部变量的定义只能有一次,它的位置在所有函数之外。在同一文件中,可以有多次对同一外部变量的声明,它的位置可以在函数内(哪个函数要用就在哪个函数中声明),也可以在函数之外(在外部变量的定义点之前)。系统根据外部变量的定义(而不是根据外部变量的声明)分配存储单元。对外部变量的初始化只能在“定义”时进行,而不能在“声明”中进行。所谓“声明”,其作用是声明该变量是一个已在其他地方已定义的外部变量,仅仅是为了扩展改变量的作用范围而作的“声明”

在函数中出现对变量的声明(除了用 extern 声明的以外)都是定义。在函数中对其他函数的声明不是函数的定义

内部函数和外部函数

函数本质上是全局的,因为定义一个函数的目的就是要被另外的函数调用。如果不加声明的话,一个文件中的函数既可以被文件中的其他函数调用,也可以被其他文件中的函数调用。但是,也可以指定某些函数不能被其他文件调用。根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数

内部函数

如果一个函数只能被本文件中的其他函数所调用,它称为内部函数

在定义内部函数时,在函数名和函数类型的前面加static ,即:

static 类型名 函数名(形参表);

内部函数又称为静态函数,因为它是用 static 声明的。

使用内部函数,可以使函数的作用域只局限于所在文件。这样子,在不同的文件中即使有同名的内部函数,也互不干扰。这就使它对外界“屏蔽”了

通常,一个大程序往往分工由不同的人分别编写不同的文件模块,在各人编写自己的文件模块时,不必担心所用函数是否会与其他文件模块中的函数同名

通常把只能由本文件使用的函数和外部变量放在文件开头,前面都冠以 static 使之局部化,其他文件不能引用。这就提高了程序的可靠性。

外部函数

如果在定义函数时,在函数的首部的最左端加关键字 extern ,则此函数是外部函数,可供其他文件调用

extern 函数类型 函数名(形参列表)

C语言规定,如果在定义函数时省略 extern ,则默认为外部函数

在需要调用此函数的其他文件中,需要对此函数作声明(不要忘记,即使在本文件中调用一个函数,也要用函数原型进行声明)。在对此函数作声明时,要加关键字 extern ,表示该函数“是在其他文件中定义的外部函数”

使用 extern 声明就能够在本文件中调用在其他文件中定义的函数,或者说把该函数的作用域扩展到本文件中

extern 声明的形式就是在函数原型基础上加关键字 extern

由于函数本质上是外部的,在程序中经常要调用其他文件中的外部函数,为方便编程,C语言允许在声明函数时省写 extern

用函数原型能够把函数的作用域扩展到定义该函数的文件之外(不必使用 extern)。只要在使用该函数的每一个文件中包含该函数的函数原型即可。函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。

利用函数原型扩展函数作用域最常见的例子是 #include指令的应用。在#include指令所指定的“头文件”中包含调用库函数所需的信息

标签:文件,定义,外部,extern,声明,变量,函数
From: https://www.cnblogs.com/EricsT/p/18546512

相关文章

  • echarts自定义tooltip
    tooltip配置tooltip:{show:true,trigger:'axis',formatter:params=>{letresult=`<div>${params[0].axisValue}</div>`params.forEach(item=>{if(......
  • vite将工具函数js打包为npm包并发布
    创建vite项目,将vue依赖清除(因为是纯函数js)npmcreatevitepackage.json中vue的依赖都删掉,把src、public等目录都删掉;package.json文件如下{ "name":"tool",//npm包名 "private":false, "version":"0.0.0", "type":"modul......
  • vue3 中,字段必须在 onShow 前定义?
    在Vue3中,如果你在组件的setup()函数中使用了生命周期钩子,比如onShow,你可能遇到了一个错误,提示你在onShow前定义了某个字段。这个错误通常意味着你尝试在组件的setup()函数中访问了一个在onShow钩子函数被调用之前尚未定义的响应式字段。为了解决这个问题,你需要确保你在......
  • vue3 h函数应用,el-table-v2定义column
    一、引入import{h}from'vue'二、column属性cellRenderer使用h函数h函数中嵌套Element组件Popconfirm{title:'注释',width:165,flexGrow:1,key:"str",dataKey:"str",cellRenderer:({rowData}:any)=>{......
  • 字符函数和字符串函数
    1.字符分类函数2.字符转换函数3.strlen的使⽤和模拟实现4.strcpy的使⽤和模拟实现5.strcat的使⽤和模拟实现6.strcmp的使⽤和模拟实现7.strncpy函数的使⽤8.strncat函数的使⽤9.strncmp函数的使⽤10.strstr的使⽤和模拟实现11.strtok函数的使⽤12.strer......
  • Flask新手教程之- 视图函数的装饰器
    除了@app.route,Flask还支持其他装饰器,用于实现更复杂的功能。 示例:@app.before_request:在每个请求处理之前运行的函数。@app.after_request:在每个请求处理之后运行的函数。@app.teardown_request:在请求结束后运行的函数,用于清理工作。  实例:@app.before_requestd......
  • 变量的存储方式和生存期
    变量的存储方式和生存期动态存储方式与静态存储方式从变量的作用域(即从空间)的角度来观察,变量可以分为全局变量和局部变量从变量存在的时间(即生存期)来观察:有的变量在程序运行的整个过程都是存在的,而有的变量则是在调用其所在的函数时才临时分配存储单元,而在函数调用结束后该存储......
  • C++中的仿函数Functor
    在C++中,有仿函数Functor的概念,首先要明白,它叫做仿函数,就说明它本身肯定不是一个函数=>事实上,它是一个类的对象,但是可以像函数一样来进行调用怎么来理解这句话呢“仿函数是一个类的对象,但是它可以像函数一样来进行调用”? 是这样的=>本质是在这个类里面实现一个operator(),......
  • C语言:函数递归
    #include<stdio.h>intmain(){ printf("haha\n"); main(); return0;}先来看这段代码,这是最简易的一段递归的代码。当我们打印完haha后会main函数调用自己,这样就会使屏幕一直打印haha,但是会停止,这是为什么呢?因为当我们为main函数在栈区开出的内存被不断使用,最后导致栈溢......
  • 自定义序列化
    #ifndefAI_PACS_JSONTOSTRUCT_H#defineAI_PACS_JSONTOSTRUCT_H#include<iostream>#include<string>#include<unordered_map>#include<variant>#include<vector>#include<nlohmann/json.hpp>#include<stdexcept>......