首页 > 其他分享 >C语言理解——static、extern等

C语言理解——static、extern等

时间:2024-07-30 21:28:52浏览次数:9  
标签:变量 作用域 函数 C语言 修饰 static extern 定义

目 录


1、static 修饰 局部变量

普通的局部变量创建后是放在栈区中,这种局部变量进入作用域时创建,出了作用域就销毁;

static修饰后的局部变量则放在静态区中,它改变了局部变量的存储位置,从而使得变量的生命周期延长,延长至程序结束才销毁。

static修饰局部变量只改变生命周期,不改变作用域。

2、static 修饰 全局变量

全局变量的作用域十分的广,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(用extern关键字进行声明)。

全局变量本身是具有外部链接属性的,在A文件中定义的全局变量,在B文件中可以通过【链接】来使用;

如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用;

3、static 修饰 函数

static修饰函数时会改变函数的链接属性,从而使得函数的作用域变小。
函数本身也是有外部链接属性的;
被static修饰后,函数的外部链接属性被修改成内部链接属性,使得这个函数只能在自己的源文件内被使用,因此函数的作用域就变小了。

4、extern 修饰 变量或函数

extern一般用在变量名前或函数名前,用来说明 “ 此变量/函数在别的源文件中定义了,要在此处声明进行引用 ”。

声明操作是没有分配内存的,只有定义才分配内存。声明可以多次,定义只能一次。最好不要在头文件中定义变量,在头文件中只声明,不定义。尽量不要在头文件中出现 “ extern int value ” 这类声明。

在头文件中使用条件编译 #ifndef 防止出现重复引入同一个头文件,导致提示 “ 变量被多次定义 ”的错误。在头文件开头加上 #pragma once 也可以防止同一个头文件被包含多次,但它不支持跨平台。

5、register 修饰 变量

register修饰的变量可能是放到寄存器中,这样可以提高CPU对该变量的访问速度,这类变量通常是需要频繁调用的。register不能修饰局部静态变量。register是很少用的。

6、const 修饰 变量

const修饰的变量表示不能再改变变量的值,再次赋值也不行,定义的时候就把值确定了,该变量是只读的。

7、typedef 起别名

给现有的数据类型起新的名称。

新名称具有文件作用域,从它被定义的地方开始到文件结尾都有效。
由编译器在编译时处理的,所以具有类型检查的功能,类型安全性高。
在同一作用域内,不同类型不能起相同的别名。

与指针结合时,能保证类型的一致性。

typedef int* INT_PTR;

INT_PTR p1, p2;  // 两个都是 int 型指针

总结:更适合用于定义新的数据类型

适用情况: 为复杂的数据类型创建新的名称,易读易懂,从名称体现出描述性、特定属性和用途。

8、#define 文本替换

给常量做简单的文本替换。

作用域从其定义点开始,直到被取消定义或遇到编译单元的结束,相对较广。
在预编译阶段就进行简单的文本替换,所以没有类型检查,可能会导致一些意外的错误,类型安全性较差。
定义的宏可以在同一作用域内多次重新定义,但通常不建议这样做。

与指针结合时,可能会产生意外的结果。

#define PTR_INT int*

PTR_INT p3, p4;  // 只有 p3 是 int 型指针,p4 是 int 型

总结:更适合用于定义常量和简单的文本替换。

应用情况:被多处使用的常量或配置参数,简短的代码片段,决定是否包含或屏蔽部分代码片段。

标签:变量,作用域,函数,C语言,修饰,static,extern,定义
From: https://blog.csdn.net/wu19870319/article/details/140743941

相关文章

  • c语言笔记(2024.7.24)第三天
    常量与变量概念:·表面:程序运行过程中取值可以改变的数据·实际:变量其实代表了一块内存区域/单元/空间。变量名可视为该区域的标识。整个变量分为三部分:·变量名:这个只是变量的一个标识,我们借助变量名来存取数据。·变量空间/存储单元:这个就是内存中分配的一块用来存放......
  • 嵌入式初学-C语言-练习二
    #针对于前六篇学习所出习题,题型内容均为本人敲写,若有不合理,或逻辑重复,请多多包涵,也请大家指点!!#1、通过键盘输入一个年份,判断是不是润年,是显示“是润年”,否则显示“不是润年”#include<stdio.h>intmain(){unsignedintyears;printf("输入一个年份\n");scanf("%d......
  • c语言(单,双,三分支)swich的运算
    分支结构分支结构:又被称之为选择结构概念选择结构:根据条件成立与否,选择相应的操作。条件构建关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:if(year%100==0&&year%4!=0)//这种......
  • 暑期学习C语言第一天完整版
    回顾今日成果:一、scanf语句的掌握我们可以看一看这道题,只是一个简单的整数输入、输出。在这之中,我们就可以利用scanf、printf语句,在使用scanf语句我们需要注意:scanf(“%d”,&a);printf("%d",a);其中关键点为,在使用scanf时,%d在双引号里面和&a中&是我们容易遗忘。二......
  • c语言第七天笔记
    作业题:设计TVM(地铁自动售票机)机软件。输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。输入钱数,计算找零(找零时优先找回面额大的钞票),找零方式为各种面额张数,可识别面额:100,50,20,10,5,1案例代码:运行效果:循环结构什么是循环代码的重复执行,就叫做循环。循......
  • Python - Static Methods
    Sometimeswehavetowritemethodsthatarerelatedtotheclassbutdonotneedanyaccesstoinstanceorclassdataforperformingtheirwork.Thesemethodscouldbesomehelperorutilitymethodsthatareusedinsidetheclassbuttheycanperformthei......
  • C语言 —— 函数递归
    目录1.什么是递归2.递归的思想3.递归的限制条件4.递归的举例4.1求n的阶乘4.2分析和代码实现4.3画图推演5.递归与迭代1.什么是递归递归是学习C语言函数绕不开的话题,那什么是递归呢?递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。#inc......
  • C语言判断输入小写字母的个数
    #include<stdio.h>intmain(){/*WriteCcodeinthisonlineeditorandrunit.*/charch;inti=0; intk=0; intnum[26]={0};printf("Input字符串:"); ch=getchar(); while(ch!='\n')//判断是否输入回车 { ......
  • C语言:指针(1)
    一.内存和地址比如,我们的内存就相当⼀栋宿舍楼,楼里有很多的房间,每个房间都有一个房间号,每个房间里都住着8个人。这时如果你的朋友想要来找你,我们只需要把房间号告诉他就能快速的找到我们。然而,,在计算机中每个房间就相当一个内存单元,每个内存单元都有一个编号,每个编号对应着......
  • C语言学习笔记 Day6(程序运行结构)
    Day6 内容梳理:1、Chapter4 程序运行结构:4.0概述,4.1条件判断语句(if/switch),4.2循环语句(while/for)Chapter4 程序运行结构4.0概述基本的3种程序运行结构:    ①顺序结构:程序按顺序执行,不发生跳转    ②选择结构:按是否满足条件,执行相对应的......