⭐️ 关键字深度剖析 ⭐️第二章(多文件\数据类型&关键字extern/static)

简介: 本文主要讲解点:extern的使用多文件的作用static的作用如何看待类型变量的命令规则sizeof 的理解

关键字-extern


  • 首先我们知道:
  1.  全局变量,是可以跨文件,被访问的
  2.  全局函数,是可以跨文件,被访问的

而跨文件使用需要声明,可以使用关键字extern来声明

注意:声明并不会开辟空间,故变量声明的时候不能设置初始值

  • 使用:
  1. 变量声明必须带上extern
  2. 函数声明建议带上extern

多文件


单纯使用源文件,组织项目结构的时候,项目越大会越复杂,而维修的成本会越来越高,这时候我们需要建立头文件来减少维护成本

  • 定义
//.h:我们称之为头文件,一般包含函数声明,变量声明,宏定义,头文件等内容(header) 
//.c: 我们称之为源文件,一般包含函数实现,变量定义等 
  • 问题

头文件被多个源文件包含,可能涉及重复包含的问题

  • 解决方案
//test.h
#pragma once //防止头文件被重复包含,当前只需要记住,后面会无数次用
#include <stdio.h>
#include <windows.h>
//test.c
#include "test.h" //""包含头文件,目前只需要知道是自己写的头文件,就用""包含即可
//main.c
#include "test.h" //同上
int main()
{
    printf("hello files!\n");
    return 0;
}

关键字-static


static修饰变量

  • 修饰全局变量

使该全局变量只能在本文件内被使用

注:影响的是作用域,而不是生命周期

  • 修饰局部变量

使变量的生命周期变成全区周期

  • 示例:
#include<stdio.h>
int fun1()
{
    int i = 0;
    i++;
   return i;
}
int fun2()
{
    static int i = 0;
    i++;
    return i;
}
int main()
{
    int x,y;
    for (int i = 0; i < 10; i++)
    {
        x=fun1();   
        y=fun2();    
    }
    printf("no static: i=%d\n", x);
    printf("has static: i=%d\n", y);
    return 0;
}


  • 输出结果

20210813212958470.png

static修饰函数

使该函数只能在本文件使用

注意:都是不能直接访问,但是可以通过嵌套对外部进行间接使用

总结-static

  • 效果
  1. 修饰全局变量,让全局变量或者函数无法跨文件访问,只能在本文件内部访问
  2. 修饰局部变量,更改该局部变量的生命周期(生命周期延长,作用域不变)
  3. 修饰函数,使函数只能在本文件内被访问,不能在其他文件内访问,通过嵌套可以访问


  • 作用

用来项目维护,提供安全维护(限制了作用域使其只能在当前文件使用)

是一种面向过程语言的封装工具(类似黑箱子)

  • 思考

为什么static修饰局部变量生命周期发生改变了?


本质:修饰后变量存放的位置发生改变,使其生命周期延长

局部变量具有临时性:存放在栈区随着入栈生成,出栈结束

static局部变量:存放在全局数据区,在整个“进程”运行生命周期都是有效的

20210724192522316.png

注意:这个空间 不是内存!!! 是进程地址空间(操作系统)

基本数据类型

20210724191259635.png

  • C常见内置类型
  1. char
  2. short
  3. int
  4. long
  5. long long
  6. float
  7. double

如何看待数据类型

  • 定义变量的本质

在内存中开辟一块空间,用来保存数据(目的)

而定义一个变量,是需要类型的,这个是基本语法决定的

  • 结论

类型决定了变量开辟空间的大小

不同的类型来满足不同应用场景(便于节省空间)


相关文章
|
C语言
带你熟知关键字static用法——C语言(举例及通俗易懂)
带你熟知关键字static用法——C语言(举例及通俗易懂)
351 0
|
人工智能 编译器 Linux
【重学C/C++系列(二)】:extern关键字用法全解析
extern 是C/C++语言中**表明全局变量或者函数作用范围(可见性)的关键字**,编译器收到extern通知,则其声明的变量或者函数可以在本模块或者其他模块使用。
【重学C/C++系列(二)】:extern关键字用法全解析
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(四)
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(四)
106 0
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(四)
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(三)
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(三)
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(三)
|
存储 Java
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(一)
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(一)
【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出(一)
|
存储 C语言
(关键字,Static,typedef)-C语言笔记
(关键字,Static,typedef)-C语言笔记
151 0
(关键字,Static,typedef)-C语言笔记
|
存储 编译器 程序员
⭐️ 关键字深度剖析 ⭐️第六章(关键字void\return\const)
本章主要讲解: 深入关键字void 深入关键字return 深入关键字const
⭐️ 关键字深度剖析 ⭐️第六章(关键字void\return\const)
|
存储 编译器 C语言
关键字深度剖析 ⭐️第一章(变量&关键字auto/register)(一)
本文主要讲解点: 初步了解关键字分类 深刻理解变量 深刻理解定义与声明 auto关键字的理解 站在存储结构角度,理解register
关键字深度剖析 ⭐️第一章(变量&关键字auto/register)(一)
|
存储 C语言
⭐️ 关键字深度剖析 ⭐️第五章(深入C语言三种类型(float/bool/指针)与“零值“的比较)(续)
浮点数在内存中存储,并不想我们想的是完整存储的 在十进制转化成为二进制,是有可能有精度损失的
⭐️ 关键字深度剖析 ⭐️第五章(深入C语言三种类型(float/bool/指针)与“零值“的比较)(续)