static
先思考一个问题,static修饰一个变量的作用是什么?
- 它的名字叫做局部静态变量或者全局静态变量,那这个变量到底可以干什么?
- 它有一个作用就是为了让该变量只在自己的编译单元中可见。对于外部文件不可见。
编译单元是什么?
举个例子吧:
现在有一个1.h 文件 内部定义了全局静态变量 static int a = 1;
然后有一个1.c文件包含了1.h, 那这个1.c就可以使用这个a变量。
但是现在我们又有一个2.c文件(没有包含1.h文件),它的内部用extern int a; 声明了a。
然后我们用Makefile将这些文件整合在一起,在make的时候就会报错,2.c 对“a”未定义的使用,在链接的时候虽然a是全局的变量,但是用static进行了修饰,它们不属于一个编译单元,所以会产生报错。
- 我们可以通过这个例子理解一下编译单元的概念 ,该例子中1.h 1.c是一个编译单元 , 2.c是一个编译单元。
理解了编译单元和static对于变量修饰的作用之后其实static对于函数的修饰和对变量的修饰作用差不多。
staic修饰函数
我们只说全局的函数,不说类中的static函数。 全局函数被static修饰了之后,该函数也就只在编译单元中可见,对于外部文件不可见。理由和上述修饰变量一样。我们用代码给大家举个例子
test1.cpp文件
#include<iostream>
static int setnonblocking(int fd)
{
std::cout << "lalala\n";
}
test.cpp
#include<iostream>
extern int setnonblocking(int fd);
int main()
{
int listenfd = 3;
setnonblocking(listenfd);
}
Makefile
main: test.o test1.o
g++ -o main test.o test1.o
test.o: test.cpp
g++ -c test.cpp
test1.o: test1.cpp
g++ -c test1.cpp
make之后就会产生如下报错:
上例中test.cpp 是一个编译单元, test1.cpp是一个编译单元
希望这篇文章可以帮助大家理解staic的一个作用。