函数名前加static的作用

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的一个作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章