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