1. 程式人生 > >重拾c——gcc編譯器、c語言注意點

重拾c——gcc編譯器、c語言注意點

由於本人該學期開設的高效能運算實驗課程主要使用c/c++程式設計,於是今天重新寫了c,可以說非常難受了(中了FORTRAN95de 毒),說一下今天的問題:

a.為了重新熟悉c,寫了個序列的矩陣乘法(兩個矩陣乘法,矩陣無特殊性,暴力乘);

b.main.cpp matrix_multi.h matrix_multi.c三個檔案:測試main,函式實現在matrix_multi.c

1)gcc編譯的問題

gcc編譯器的流程:

第一步,編譯器對.c檔案進行預處理:檢查#include中<>和“”的檔案位置,編譯器首先去c庫中尋找,然後在當前目錄中尋找;

生成的預處理檔案main.i(可以用vim檢視,裡面列出了庫函式的呼叫路徑)

gcc -E main.c -o main.i

第二步,編譯器對.i檔案進行詞法分析(編譯原理),檢查語法錯誤,編譯生成組合語言的程式碼檔案main.s;

gcc -S main.i -o main.s

第三步,編譯器將彙編程式碼轉為二進位制程式碼檔案main.o;

gcc -c main.s -o main.o

第四步,連結器將二進位制檔案轉為可執行檔案main(靜態連結庫),為靜態變數分配實際的系統記憶體。

gcc main.o -o main

一步到位:

gcc main.c -o main

編譯多個檔案:

matrix_multi.c中實現了矩陣乘法的函式,matrix_multi.h宣告其函式名。

編譯時,無需編譯matrix_multi.h檔案(gcc預處理階段會直接在當前目錄尋找):

gcc main.c matrix_multi.c -o main

2)define巨集防止標頭檔案重複:防止.h檔案被重複引用(導致函式、變數重新命名)

#ifndef _MATRIX_MULTI.H
#define _MATRIX_MULTI.H

//code: variable and function declaration

#endif