C语言中static和extern的区别

合集下载

static在c语言中用法

static在c语言中用法

static在c语言中用法static在C语言中的用法C语言是一种广泛应用于系统级编程的编程语言,因其简洁、高效的特点而被广泛采用。

其中,static是C语言中的一个关键字,具有多种用法和功能。

本文将逐步介绍static关键字在C语言中的不同用法和作用。

1. 静态变量static关键字可以用于声明静态变量。

静态变量与普通变量的不同之处在于,它们的生存周期会持续到整个程序的执行过程中,而不仅限于函数调用期间。

在函数内部使用static关键字声明的变量,其值会在函数调用结束后依然保持,下次函数调用时仍然可用。

以下是一个示例:c#include <stdio.h>void increment() {static int counter = 0;counter++;printf("Counter: d\n", counter);}int main() {increment();increment();increment();return 0;}运行结果将会输出:Counter: 1Counter: 2Counter: 3可以看到,每次调用increment函数时,静态变量counter的值都会保持,并在下次调用时继续递增。

2. 静态函数static关键字还可以用于声明静态函数。

静态函数与普通函数的区别在于,静态函数仅在声明它的源文件中可见,无法被其他源文件所调用。

这种封装的特性使得静态函数在模块化编程中起到了一定的作用。

以下是一个示例:c文件1:test1.c#include <stdio.h>static void static_function() {printf("This is a static function.\n");}void normal_function() {printf("This is a normal function.\n");}文件2:test2.cvoid normal_function();int main() {static_function(); 错误,static_function无法被该源文件所调用normal_function(); 正确,normal_function是全局函数return 0;}在上述示例中,test1.c声明了一个静态函数static_function()和一个全局函数normal_function(),而test2.c只能调用全局函数normal_function(),而无法调用静态函数static_function()。

C中的auto、static、register和extern的区别

C中的auto、static、register和extern的区别

} int A=13,B=-8;
也可以在多文件的程序中声明外部变量。
extern还可声明函数,eg:extern int fun(int a, int b);声明的外部函数可供其他文件调用,在C中,定义函数时省略extern,则隐含为外部函数 另附加一个两个关键字const和volitate
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
auto变量:函数中的局部变量,如不专门声明static,一般都是动态地分配存储空间。自动变量:在调用该函数时系统会给他们分配存储空间,一旦函数调用结束这些存储空间就会自动释放。关键字“auto”可以省略,不写则隐含确定为“自动存储类别”,属于动态存储方式。

c语言中static变量详解

c语言中static变量详解

c语⾔中static变量详解Static翻译出来是“静态”“静⽌”的意思,在C语⾔中的意思其实和它的本意差不多,表⽰“静态”或者“全局”的意思,⽤来修饰变量和函数。

经static修饰过后的变量或者函数的作⽤域或者存储域会发⽣变化,⽽由static修饰的变量在初始值⽅⾯也会表现出static关键字的优势。

想知道经static修饰过后的变量或者函数的作⽤域或者存储域发⽣了什么变化吗,发⽣变化的原因是什么吗?请⼤家继续往下看!⼀、c程序的内存分布既然static是⽤来修饰变量和函数的,⽽变量和函数⼜是组成c程序必不可少的,C程序的内存分布图如下。

C程序由下⾯5部分组成: 1)正⽂段——CPU执⾏的机器指令部分;⼀个程序只有⼀个副本;只读,防⽌程序由于意外事故⽽修改⾃⾝指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这⾥。

3)⾮初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。

4)栈——增长⽅向:⾃顶向下增长;⾃动变量以及每次函数调⽤时所需要保存的信息(返回地址;环境信息)。

5)堆——动态存储区。

是向⾼地址扩展的数据类型,是⾃下向上的扩展⽅式。

c程序内存分布图上⾯的C程序分布图很明显的告诉我们,变量是存储在栈区或者堆区或者bss段或者data段,变量的存储域为什么会有所不同呢?其实原因很简单,说⽩了就是与他们定义在程序的不同地⽅,有没有static关键字修饰有关啦,定义在不同的地⽅也说明了他们有着不同的作⽤域。

⼆、static修饰的变量1. 全局静态变量 在全局变量之前加上关键字static,全局变量就被定义成为⼀个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运⾏期间都存在) 2)初始化:未经初始化的全局静态变量会被程序⾃动初始化为0(⾃动对象的值是任意的,除⾮他被显⽰初始化) 3)作⽤域:全局静态变量在声明他的⽂件之外是不可见的。

static和extern的区别

static和extern的区别

一些基本概念:1. 编译单元(模块):在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC 这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。

我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组成,每个obj文件里包含了变量存储的相对地址等。

2. 声明与定义的区别函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解,对同一个变量或函数的声明可以有多次,而定义只能有一次!3. extern的作用extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b); 则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的, C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了 (不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern intg_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或者其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可, 在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。

C语言32个关键字九种控制语句34种运算符

C语言32个关键字九种控制语句34种运算符

第一个关键字:auto用来声明自动变量。

可以显式的声明变量为自动变量。

只要不是声明在所有函数之前的变量,即使没加auto关键字,也默认为自动变量。

并且只在声明它的函数内有效。

而且当使用完毕后,它的值会自动还原为最初所赋的值。

自动变量使用时要先赋值,因为其中包含的是未知的值。

例:auto int name=1;第二个关键字:static用来声明静态变量。

可以显式的声明变量为静态变量。

也为局部变量。

只在声明它的函数内有效。

它的生命周期从程序开始起一直到程序结束。

而且即使使用完毕后,它的值仍旧不还原。

即使没有给静态变量赋值,它也会自动初始化为0.例:static int name=1.第三个关键字:extern用来声明全局变量。

同时声明在main函数之前的变量也叫全局变量。

它可以在程序的任何地方使用。

程序运行期间它是一直存在的。

全局变量也会初始化为0.例:extern int name;第四个关键字:register用来声明为寄存器变量。

也为局部变量,只在声明它的函数内有效。

它是保存在寄存器之中的。

速度要快很多。

对于需要频繁使用的变量使用它来声明会提高程序运行速度。

例:register int name=1;第五个关键字:int用来声明变量的类型。

int为整型。

注意在16位和32位系统中它的范围是不同的。

16位中占用2个字节。

32位中占用4个字节。

还可以显式的声明为无符号或有符号:unsigned int signed int .有符号和无符号的区别就是把符号位也当作数字位来存储。

也可用short和long来声明为短整型,或长整行。

例:int num;第六个关键字:float用来声明变量的类型。

float为浮点型,也叫实型。

它的范围固定为4个字节。

其中6位为小数位。

其他为整数位。

例:float name;第七个关键字:double用来声明为双精度类型。

它的范围为8个字节。

14位为小数位。

也可使用更高精度的long double 它的范围则更大,达到10字节。

c语言中变量的存储类别

c语言中变量的存储类别

一.C语言中,从变量的作用域角度来分,可以分为全局变量和局部变量。

二.变量值存在的时间角度来分,可以分为静态存储方式和动态存储方式。

所谓静态存储方式是指在程序运行期间有系统分配固定的存储空间的方式。

而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。

具体包含4种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。

1. 自动的(auto)在调用函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量。

2. 静态的(static)为了满足局部变量的值在函数调用结束后不消失而且保留原值,既占用的存储单元不释放,就出现了静态的局部变量,用static来声明的局部变量。

局部变量的特点:(1)相对自动变量(即动态局部变量),在程序的运行期间都占用静态存储区,直到程序结束才释放该存储区。

(2)静态局部变量只是在程序编译时赋初值,以后每次调用时不再重新赋初值,而只是保留上次函数调用结束时的值。

动态局部变量编译时不赋初值,直到程序调用时才给变量赋值,每次调用都要赋初值。

(3)在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时会自动赋初值0或空字符。

而对动态局部变量,不赋初值则它的值是一个不确定的值,因为动态变量每次都要自动分配存储空间,存储空间的值是不固定的。

(4)静态局部变量在函数调用结束后不释放,但其他函数是不能调用的。

3.寄存器的(register)为了提高程序的执行效率,对一些运算频繁的变量定义为寄存器变量可以节省每次程序执行时的内存读取,大大节省了时间,提高了效率。

寄存器的一些特点:(1)寄存器变量的特点程序运行时分配寄存器存储空间,结束时释放。

这个特点限定了只能把局部自动变量和形式参数定义为寄存器变量。

(2)局部静态变量不能定义为寄存器变量。

4. 外部的(extern)外部变量是在函数的外部定义的全局变量,他的作用是从变量的定义初开始,到本程序文件的末尾。

extern类型变量

extern类型变量

extern类型变量extern类型变量是C语言中的一种变量声明方式。

在C语言中,extern关键字用于声明一个变量,该变量在其他地方已经定义,而不是在当前文件中定义。

本文将从extern类型变量的定义、作用和使用技巧等方面进行详细介绍。

一、extern类型变量的定义extern类型变量的定义并不会分配内存空间,它只是告诉编译器该变量在其他文件中已经定义过了。

在使用extern类型变量之前,需要先在其他文件或者当前文件的其他位置进行定义。

通过使用extern关键字,可以将这些定义过的变量引入到当前文件中,从而实现变量的共享和跨文件访问。

1. 实现全局变量的共享:在多个源文件中,可以使用extern关键字将全局变量声明为extern类型,从而实现对全局变量的共享访问。

这样可以避免在每个文件中都重新定义相同的全局变量,提高代码的复用性和可维护性。

2. 解决重复定义的问题:当多个源文件中出现相同名称的全局变量时,可以使用extern关键字将其中一个声明为extern类型,从而避免重复定义的错误。

这样可以确保在链接时,只有一个实际的变量被分配内存空间。

3. 跨文件访问函数:除了全局变量外,extern关键字还可以用于声明函数的跨文件访问。

通过在函数声明中使用extern关键字,可以将函数引入到当前文件中,从而实现函数的共享和跨文件调用。

三、extern类型变量的使用技巧1. 声明和定义分离:为了提高代码的可读性和可维护性,建议将extern类型变量的声明和定义分离到不同的文件中。

在一个文件中声明变量为extern类型,在另一个文件中进行实际的定义和初始化操作。

2. 使用头文件:为了方便管理extern类型变量的声明,可以将这些声明放在一个独立的头文件中,并在需要使用这些变量的文件中包含该头文件。

这样可以避免重复声明的问题,提高代码的可维护性。

3. 使用static关键字:在某些情况下,我们可能希望限制extern 类型变量的作用域,只在当前文件中可见。

c语言中static int的作用和用法

c语言中static int的作用和用法

c语言中static int的作用和用法C语言中的"static int"主要用于限定变量的作用范围和生命周期。

接下来,将对"static int"的用法和作用进行详细解释。

首先,让我们了解一下C语言中变量的作用范围和生命周期。

在C语言中,变量可以具有不同的作用范围和生命周期,包括以下几种类型:1. 自动变量(auto variable):这是C语言中默认的变量类型,在函数内部声明的变量就是自动变量。

自动变量的作用范围只限于声明它的函数内部,并且在函数执行完毕后会自动释放。

2. 外部变量(external variable):这是在函数外部声明的全局变量。

外部变量的作用范围可以跨越整个程序,在任何地方都可以被访问。

它的生命周期是在程序执行期间始终存在。

3. 静态变量(static variable):静态变量可以在函数内部或者外部声明。

静态变量的作用范围与外部变量相同,即全局可访问。

但与外部变量不同的是,静态变量只能在声明它的函数内部使用。

它的生命周期也是在程序执行期间始终存在。

了解了这些变量的基本概念后,接下来我们来讨论"static int"的具体用法和作用。

1. 在函数内部使用"static int":在函数内部声明一个"static int"变量,可以用于实现一个持久的局部变量。

这意味着该变量的值在函数调用之间保持不变。

举个例子:c#include <stdio.h>void printCount() {static int count = 0; 声明一个静态变量count++;printf("Count: d\n", count);}int main() {printCount(); 输出Count: 1printCount(); 输出Count: 2printCount(); 输出Count: 3return 0;}在上述示例中,函数printCount中的静态变量count在每次函数调用之间保持不变。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言中static和extern的区别
C语言中static和extern的区别
导语:由于变量的声明可以有多次,但定义只能有一次,这就不可避免地要使用extern,static关键字。

弄清楚这几个关键字之间的用法和区别,能节省很多调试项目的时间,尤其是对于一些难以定位的链接错误。

下面是C语言中static和extern的'区别,一起来学习下吧:
static:
一、在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。

1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。

全局静态变量有以下特点。

a.在全局区分配内存。

b.如果没有初始化,其默认值为0.
c.该变量在本文件内从定义开始到文件结束可见。

2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下:
a.该变量在全局数据区分配内存。

b.它始终驻留在全局数据区,直到程序运行结束。

c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

3、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,其特点如下:
a.静态函数只能在本源文件中使用
b.在文件作用域中声明的inline函数默认为static类型
二、在C++中新增了两种作用:定义静态数据成员或静态函数成员。

定义静态数据成员。

a.内存分配:静态数据成员在程序的全局数据去分配。

b.初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义。

静态数据成员因为程序以开始运行就必须存在,所以其初始化的最佳位置在类的内部,public、protected、private关键字对它的限定和普通数据成员一样,因为其空间在全局数据分配,属于所有本类的对象共享。

它不属于特定的类对象,在没产生类对象时,其作用域可见,即没有产生类的实例时,就可以操作它了。

静态成员函数。

静态成员函数与类相联系,不与类的对象相联系。

静态成员函数不能访问非静态数据成员。

extern:
extern可以置于变量或函数前,以在别的文件中标识变量或函数的定义,并提示编译器遇到此变量或函数时在其他模块中寻找其定义。

extern是C、C++语言中表明函数和全局变量作用范围(可见性)的关键字。

对于extern变量来说,仅仅是一个变量的声明,其并不是定义,不会分配内存空间。

extern表示将变量或函数声明为外部链接,变量默认是内部链接,函数默认是外部链接。

因此用来外部链接的函数,声明时有无extern 都可以连接通过。

而全局变量则不行。

通常,在模块的头文件中,对本模块提供给其他模块引用的函数和全局变量以关键字extern声明。

【C语言中static和extern的区别】。

相关文档
最新文档