【static&extern,有心得】staitc在C中,修饰函数.(让我明白了,在include该文件后,则该文件的static也可见了)

链接:http://blog.sina.com.cn/s/blog_4f8ea2ef0100y8d3.html

我的笔记:

1)static 终于搞明白了,#include (“预处理” 命令)进来的就相当于文件内的!

看到有人在 .h 文件里既声明又定义 static 函数,很疑惑还专门问了他

2)关于 .h 和 .cpp 文件的纠葛

// test.c

void test() {

    printf("123\n");

}

// main.c

(extern) void test();

int main() {

    test();

    return 0;

}

这个例子里面,即使没有 test.h,也能编译链接通过,对于 .h 文件发挥的作用更加清晰了!

static函数(也叫内部函数)
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数)
static 在 c 里面可以用来修饰变量,也可以用来修饰函数。
先看用来修饰变量的时候。变量在 c 里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。

int a ;
main() {
	int b;
	int* c= (int*)malloc(sizeof(int));
}
a 是全局变量,b 是栈变量,c 是堆变量。
static 对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多 .c 文件构成。彼此可以互相引用变量,但加入 static 修饰之后,只能被本文件中函数引用此变量。

static 对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由 OS 管理,在退栈的过程中,栈变量的生命也就结束了。但加入 static 修饰之后,变量已经不在存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。

static 对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

static 声明的变量在C语言中有两方面的特征:
1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
// test.h
static void test();
---
// test.c
#include "test.h"
#include <stdio.h>
#include <stdlib.h>
static void test() {
	printf("test....\n");
}
---
// main.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
int main(int argc, char *argv[]) {
	test(); // 如果去掉这个调用程序将可以编译,相当于只申明了一个静态函数,没有使用它的话不会去找它的实现,
	// 如果不去掉它, 将无法编译通过,因为静态函数的生命期是本 main.c 文件,而在此文件中找不到 test() 的实现。
	// 如果在此要调用 test(), 必须将 test.c 中的 test() 实现移到 main.c or test.h
	//这也就是为什么将 定义和实现分开的原因
	system("PAUSE");
	return 0;
}
--EOF--

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.h文件使用`extern`关键字来修饰函数的声明是可行的,它可以用于在多个源文件之间共享函数的声明。 通常,.h文件用于存放函数的声明和结构体、枚举等的定义。当多个源文件需要使用相同的函数时,可以在.h文件声明这些函数,并在需要使用它们的源文件包含该.h文件。 当在.h文件声明函数时,使用`extern`关键字可以显式地说明该函数是在其他源文件定义的,而不是在当前源文件定义。这样,在包含该.h文件的源文件,就可以使用该函数而不会导致重复定义错误。 例如,假设有一个functions.h文件,其声明了一个函数: functions.h: ```c extern void sharedFunction(); // 声明一个在其他文件定义的函数 ``` 然后,在其他源文件定义该函数: file1.c: ```c #include "functions.h" void sharedFunction() { // 函数定义 } ``` file2.c: ```c #include "functions.h" int main() { sharedFunction(); // 调用共享的函数 return 0; } ``` 通过在functions.h使用`extern`关键字声明函数,并在其他源文件定义该函数,可以在file2.c使用`extern`关键字来引用共享的函数。 总而言之,虽然在.h文件使用`extern`关键字不是必需的,但它可以显式地声明函数是在其他源文件定义的,从而帮助确保在多个源文件共享函数时不会引起重复定义错误。这样可以提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值