重拾c——gcc編譯器、c語言注意點
阿新 • • 發佈:2019-02-02
由於本人該學期開設的高效能運算實驗課程主要使用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