C語言中的鏈接類型:在上一篇博客中,講到了C的存儲類型,存儲類型的關鍵字是auto,static,extern,和register而在本篇幅中,同樣我們也會用到auto,static,extern,但是本篇幅中的這幾個關鍵字不僅僅將用來修飾變量,同樣也可以用來修飾函數,在修飾函數的時候,他們將會有不同的意義,當然也會對其修飾變量會有一個更深的理解
什麼叫鏈接屬性,
在C語言的編譯過程中有一個步驟叫做鏈接,鏈接的作用就是將外部的函數庫通過鏈接形式,變成二進制的可執行文件,那麼,就是不同文件之間的關系。而這裡的鏈接其中的一個含義就是函數或者變量在不同文件中是怎麼相互調用的;
下面講一下C語言中幾種鏈接類型:
允許外部文件調用非本文件的函數或者變量,或者在本文件中,函數執行在定義之前的時候,使用extern進行提前聲明的話,編譯時候不會報錯———–>類似java中的public
用static修飾的變量或者函數的鏈接屬性為其作用領域只能僅限在本文件中 ,在其他文件中就不能進行調用,不同文件中的內部函數是不會相互干擾的——–>類似java中的private
使用auto進行定義的變量,其作用域僅限在當前的函數中,誇函數則不能夠進行調用
/**
*extern1使用
*/
#includeint main(void){ extern int a,b;//定義在使用之前,那麼這個時候需要用extern來修飾。表示鏈接 printf("plus:%d\n",a,b); return 0; } int a = 10,b = 20;
/**
*extern2使用
*/
頭文件
#ifndefine __EXTERNAL_DEMO_H_ #define __EXTERNAL_DEMO_H //在頭文件聲明的時候用extern來修飾 external int add(int a,int b); #endif
實現文件external_demo.c
#include "external_h.h" //在文件內部進行使用,外部文件不能訪問 static int num = 20; //用於外部文件調用,用extern來修飾 extern int add(int a, int b){ return a+b; }
測試文件:
#includeint main(void){ int a = 20; int b = 30; printf("plus:%d\n"add(a,b)); return 0; }
頭文件
#ifndef __STATIC_DEMO_H_ #define __STATIC_DEMO_H_ int add(int a, int b); #endif
#include "staticDemo.h" #include//靜態static修飾的函數聲明,只能在staticDemo中去使用 static void out_result(int); //靜態static修飾的變量,只能在本文件中使用,外部文件無法訪問 static int num = 50; //缺省默認是extern修飾的,外部是可以進行訪問的 int add(int a,int b){ int plus = a + b; out_result(plus); return plus; } static void out_result(int result){ printf("out_result:%d\n",result); }
#include#include"staticDemo.h" int main(void){ int num1 = 10; int num2 = 20; add(num1,num2); return 0; }
總結一下:
用extern來修飾的函數或者變量,外部文件可以調用或訪問。
用static修飾的函數,只能在本文件內部進行使用,外部不能訪問
使用auto修飾的變量只能本函數內部進行使用,外部不能調用或者訪問,修飾函數默認缺省的時候外部文件是可以進行訪問調用的、
鏈接屬性的理解對於我們後面將項目分成很多模塊是很有幫助的,每個模塊之間都是通過鏈接形式,形成一個大的文件,什麼允許外部訪問,什麼不允許外部進行訪問,作為一個程序猿來說,是要有一定辨別能力的