函數名前加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的一個作用。

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