[C语言 - 6] static & extern

A. extern函数

一个c文件生成一个obj文件

外部函数:允许其他文件访问、调用的函数(默认函数为外部函数),不允许存在同名的外部函数

my.c

1 //define a extern function perfectly
2 void extern testEx()
3 {
4     printf("my.c ==> call external function\n");
5 }
6  

main.c

1 //declare the function first to apply the C99 compiler standard
2 void extern testEx();
3
4 int main(int argc, const char * argv[]) {
5     testEx();
6     return 0;
7 }

B. static函数

内部函数:只能在当前文件中使用的函数,不同的源文件可以有同名的内部函数

使用static修饰就可以定义内部函数

one.c

1 static void one()
2 {
3     printf("one.c ==> one()\n");
4 }
5  

C.extern 与全局变量

java中可以调用后定义变量

c不能使用定义前的全局变量

ps:定义和声明是两个不同的步骤

 1 //first solution, define the variable before calling
 2 //int a;
 3
 4 //declare a variable
 5 extern int a;
 6
 7 int main(int argc, const char * argv[]) {
 8
 9     a = 10;
10
11     return 0;
12 }
13
14 //define the variable
15 int a;

若想在某个全局变量声明之前使用,就需要使用extern修饰变量,表示该变量即将在下面定义。

1 void test()
2 {
3     extern int b;
4     printf("b = %d\n", b);
5 }
6
7 int b = 3;

D.static和全局变量

定义和声明一个内部变量,只能被本文件访问,不能被其他文件访问

E.static与局部变量

被static修饰的局部变量,生命周期能周延长到程序结束

但是作用域没有改变

1 void test()
2 {
3     static int e = 10;
4     e++;
5     printf("e = %d\n", e);
6 }

main调用

test();
    test();
    test();

out:

e = 11
e = 12
e = 13

F.全局/局部变量:

变量可以在函数内部或者外部声明

a.全局变量中:

全局变量(函数外)可以重复声明,不能重复定义

int a;//标记为weak,允许进行定义

int a = 4;//succuss,标记为strong,以此变量为同名全局变量的标准,不允许进行多重定义

int a = 5;//error

如在不同的源文件中存在同名全局变量,都是指的同一个变量

b.局部变量:

局部变量(函数内)不能重复声明

内部变量对外部变量的影响

可以区分开两个同名变量

static & extern 总结

extern能够声明一个全局变量,但是不能定义?

—》能声明,不能重复定义

static 可以声明并定义一个内部变量?

时间: 2024-10-29 19:05:29

[C语言 - 6] static & extern的相关文章

黑 马 程 序 员_视频学习总结<C语言>----07 static和extern关键字、typedef

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.外部函数 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数 二.内部函数 内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部使用,就称为内部函数.C语言规定不同的源文件可以有同名的内部函数,并且互不干扰. 三.static.extern与函数的总结 1.在定

typedef Define static extern的区别

typedef Define static  extern的区别 1) #define#definePI 3.1415926 程序中的:PI*r*r 会替换为#define语句中的数字9 g 2)typedef是在编译时处理的.它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition. extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到

static extern const

static 1.局部变量 // 该变量生命周期不仅仅是进入该函数后,而是整个程序运行期间 void foo() { static int nVar = 0; printf("var = %d\n", ++nVar); } 2.保护本地变量 static int g_nVar; // g_nVar只能在本文件中使用,其他文件不能通过extern访问该变量 3.静态成员变量 // 该变量不属于对象,而属于这个类 class Foo { public: static int nCount;

iOS之const,static,extern简介

const,static,extern简介 一.const与宏的区别: • const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. ? 编译时刻:宏是预编译(编译之前处理),const是编译阶段. ? 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误. ? 宏的好处:宏能定义一些函数,方法. const不能. ? 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换. • 注意:很多Blog都说使用宏,

【学习笔记】【C语言】static和extern对函数的作用

如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数.内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部使用,就称为内部函数.C语言规定不同的源文件可以有同名的内部函数

【学习笔记】【C语言】static和extern对变量的作用

 1.全局变量分2种: 外部变量:定义的变量能被本文件和其他文件访问 1> 默认情况下,所有的全局变量都是外部变量 1> 不同文件中的同名外部变量,都代表着同一个变量  内部变量:定义的变量只能被本文件访问,不能被其他文件访问 1> 不同文件中的同名内部变量,互不影响  static对变量的作用: 定义一个内部变量  extern对变量的作用: 声明一个外部变量  static对函数的作用: 定义和声明一个内部函数  extern对函数的作用: 定义和声明一个外部函数(可以省略) 2.代

static extern const修饰符

const const修饰的东西不能被修改(由左至右解读-->顺时针螺旋法则) 指针类型根据位置的不同可以理解成3种情况: 1.常量指针 NSString * const pt1; //常量指针,指向一个字符串 //pt1初始化之后不能赋值,指向的对象值可以修改. //定义字符串常量 //NSString* const [email protected]"123"; @"123"存储在文字常量区,相同的字符串只存储一份 NSString* [email pro

c语言中用static修饰的函数与普通函数的区别

C程序一直由下列部分组成:1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令:2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里.3)非初始化数据段(bss段)——在程序中没有初始化的全局变量:内核将此段初始化为0.4)栈——增长方向:自顶向下增长:自动变量以及每次函数调用时所需要保存的信息(返回地址:环境信息).5)堆——动态存储分. 在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量.1)内存中

03 - const static extern

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const可以在一定程度上提高程序的安全性和可靠性,再者在看别人的代码作品的时候也可以有助于清晰理解const所起的作用. 1.const和#define的区别 (1)编译器处理的方式不相同 define定义的宏是在预处理阶段展开的,而const定义的常量则是在编译阶段使用的 (2)类型和安全检查不同 define宏没有类型,并且不做任何的类型检查,仅仅是展开 const常量具有具体的类型,在编译阶段会执行类型检查 (3)存储方式不