Extern修飾詞

Download Report

Transcript Extern修飾詞

extern
extern
變數在全域中不能重複宣告相同的變數名
稱,但不同程式碼可能會用到相同的變數。
 extern 修飾詞代表這個變數宣告在其他
地方。
 函數也可加上extern,但是可加可不加
(函數模型)
 EX : void func();  extern void func();

extern example
//XD.c
 int XD=100;
 ----------------------------------------------------- //main.c
 #include<stdio.h>
 extern int XD;
 int main(){
printf(“%d\n”,XD);
}

extern的初始化

若在宣告具有extern修飾的變數時初始化,
會視為沒有extern,需要特別注意。
extern int XD=2;

 Int XD=2;

static
static變數
經由static修飾過的變數,經過宣告後,記
憶體就不會改變,下次執行時不再重新宣告。
 void GO(){
static int c=0;
printf(“%d\n”,++c);
}
 int main(){
int i;
for(i=0;i<10;i++)
GO();
}

static的另一個意義

加上static修飾詞的變數(或函數),只會被
允許在這個檔案中使用,其他程式碼都無
法使用。
gcc compiler
gcc


gcc是C的編譯器,在UNIX環境下可以直
接使用,在windows環境下可以下載或從
Dev-C++資料夾中的bin資料夾中找到。
在windows環境下若設環境變數,則可在
command line直接呼叫。
使用gcc編譯檔案


$gcc -o 輸出檔名 要編譯的檔案(s)
若無指定輸出檔名,UNIX下預設為a.out,
windows下預設為a.exe。
編譯的過程
編譯檔案
(將原始碼編譯)
 產生目的檔
(產生.o檔)
 鏈結函式庫
(根據目的檔及使用者的指令鏈結需要用
到的函式庫)
 產生執行檔
(產生最後的執行檔)

使用gcc產生目的檔
$ gcc –c 原始碼.c
 則會產生原始碼.o的目的檔


若要將目的檔產生執行檔,與一般的編譯
方式相同。
編譯優化參數
-O0:預設狀態
 -O1:初步最佳化
 -O2:進一步最佳化,為推薦的優化。
 -O3:不要用,很可怕。
最危險的編譯等級,有可能發生錯誤,在
gcc4.x中甚至不被推薦使用。
 -pipe:加速編譯時間,對結果無影響。

make


make是一個很方便的工具,可以依據提
供的描述檔,迅速幫你執行完很多編譯相
關的指令。
與gcc相同,UNIX環境下有預設,
windows環境下則需要下載並設定環境變
數。
最簡單的編譯
$make code
 $gcc code.c -o code

這是make沒有其他參數的情況
 需要特別注意這邊的檔名不加附檔名
 若附檔名為c以gcc編譯,若為cpp則以
g++編譯。

描述文件
make的描述文件代表的是程式碼與程式碼
之間的依賴關係(規則),並依照此關係依序
編譯。
 目標檔案:需要檔案1 需要檔案2…
 <TAB>產生指令
 all:test.o test2.o

 gcc test.o test2.o -o test.exe

test.o:test.c
 gcc -c test.c

Test2.o:test2.c
 gcc -c test2.c
make的執行過程


make會從名稱為all(不一定產生的檔名就
叫做all)的規則執行(若沒有all則從第一個
執行)
接著尋找目錄中是否存在所有需要檔案,
若有缺少則尋找其他規則是否可以產生需
要檔案。
描述文件的位置


make -f 描述文件
若沒有特別指定,make或尋找檔名為
Makefile或makefile的文件
#include<signal.h>
Signal


<signal.h>提供了一個手段
(signal function),可以在當程式發生不
可預期情況(例如ctrl+c,除以0…等等)
時,作例外處理。
當然,使用的時候就要include<signal.h>
Signal常數
Signal
Explanation
SIGABRT
Abnormal termination of the program (such as a call to function abort).
SIGFPE
SIGILL
An erroneous arithmetic operation, such as a divide by zero or an operation
resulting in overflow.
Detection of an illegal instruction.
SIGINT
Receipt of an interactive attention signal.
SIGSEGV
An invalid access to storage.
SIGTERM
A termination request set to the program.
節自上課投影片
Signal函式
*signal( int signal, void (* func) (int))
 Signal函式會偵測常數為signal的狀況,
並以func例外處理,並回傳函數的指標,
如果發生錯誤會回傳SIG_ERR。

raise函式
raise(int signal);
 直接造成某種signal發生。
