01回顧
02 語言介紹
語言是人和人交流,c語言是人和機器交流。
03_為什麼學c語言
04_第一個c代碼編譯運作
#include <stdio.h>
int main()
{
// 這是第一個c代碼
printf(‘hello world’)
return 0
}
gcc 01.c
3、 return 0 代表程式正常結束
// 使用某個函數前,添加頭檔案
// 1、頭檔案類似于菜單,頭檔案包含函數的聲明,菜單列舉了菜名,
// 函數調用,相當于點菜
// <>通過包含系統的頭檔案(标準的頭檔案),” ” 包含自定義的頭檔案
man 3 printf
(
1是普通的指令
2是系統調用,如open,write之類的(通過這個,至少可以很友善的查到調用這個函數,需要加什麼頭檔案)
3是庫函數,如printf,fread
vi usr/include/stdio.h
// 1、函數調用,printf功能往标準輸出裝置(螢幕)列印内容
// 2、\n代表換行
// 3、函數的調用必須放在{}内部
06 c代碼分析總結
頭檔案什麼時候需要包含?
點菜的時候需要包含菜單,是以用函數的時候就需要包含頭檔案
07 windows通過gcc編譯代碼
windows編譯代碼
1) cd 目錄
2) dir 檢視目錄資訊
3) gcc hello.c 預設在目前路徑,生成a.exe
gcc hello.c -o hello: 生成hello.exe
4) 運作,在windows下運作
./a
或者a.exe
不能寫./a.exe
cmd
gcc -v
gcc hello.c
gcc hello.c -o hello
08 補充
gcc(gnu compiler collection, gnu 編譯器套件), 是由gnu開發的編譯語言編譯器。gcc原本作為gnu作業系統的官方編譯器,現已被大多數類unix作業系統(如linux、bsd、mac os x 等)采納為标準的編譯器,gcc同樣适用于微軟的windows。
gcc最初用于編譯c語言,随着項目的發展gcc已經成為了能夠編譯c、c++、java、…object c、object c++、go語言的編譯器大家族。
linux編譯的隻能在linux運作 32隻能在32 64隻能在64。
windows編譯隻能在window運作 32的可以在64運作, 64隻能在64運作。
09 system調用指令
man 3 system
system函數的使用
int system(const char* command);
功能:在已經運作的程式中執行另外一個外部程式
參數:外部可執行程式名字
傳回值:不同系統傳回值不一樣
# include <stdio.h>
# include <stdlib.h>
int main(){
printf(‘before sys\n’)
system(‘ls -alh’) //取決于程式目前所在的目錄
printf(‘after sys\n’)
return 0
11. system調用外部程式
printf(‘asdsad’)
system(‘waibu) //外部也是一個編譯好的檔案
printf(‘after sys’)
13 system不同系統傳回值不一樣
printf(“before sys\n”)
// 1 需要頭檔案 #include <stdlib.h>
// 2 system功能: 調用外部程式
int a = system(“waibu”) // .\waibu.exe
printf(“a = %d\n”,a)
printf(“after sys\n”)
waibu
return 250
windows下輸出250
linux下輸出的不是250
結論:c語言所有的庫函數的調用,隻能保證文法是一緻的,但不能保證執行結果是一緻的,同樣的庫函數在不同的作業系統下執行結果可能是一樣的,也可能是不一樣的。
在學習linux發展史時,我們得知linux的發展離不開posix标準,隻要符合這個标準的函數,在不同的系統下執行的結果就可以一直。
unix和linux很多庫函數都是支援posix的,但windows支援的比較差,如果将unix代碼一直到linux一般代價很小,如果把windows代碼一直到unix或者linux就比較麻煩
posix表示可移植作業系統接口(portable operating system interface of unix,縮寫為 posix ),posix标準定義了作業系統應該為應用程式提供的接口标準,是ieee為要在各種unix作業系統上運作的軟體而定義的一系列api标準的總稱,其正式稱呼為ieee 1003,而國際标準名稱為iso/iec 9945。
posix标準意在期望獲得源代碼級别的軟體可移植性。換句話說,為一個posix相容的作業系統編寫的程式,應該可以在任何其它的posix作業系統(即使是來自另一個廠商)上編譯執行。
posix 并不局限于 unix。許多其它的作業系統,例如 dec openvms 支援 posix 标準,尤其是 ieee std. 1003.1-1990(1995 年修訂)或 posix.1,posix.1 提供了源代碼級别的 c 語言應用程式設計接口(api)給作業系統的服務程式,例如讀寫檔案。posix.1 已經被國際标準化組織(international standards organization,iso)所接受,被命名為 iso/iec 9945-1:1990 标準。
14 字元串編碼介紹
1)windows預設支援的中文編碼為gbk,gb2312,ansi,
2)linux預設支援的中文編碼為utf-8(unicode
15 qt調用system
隻在windows有效
calc
mspaint
qt調用system
17 mfc調用system
qt可以用來做界面
mfc( microsoft foundation class) 是微軟出的做界面的,在visual studio裡面使用
18 gcc編譯過程
預處理和 連結一定是确定的兩個步驟。 編譯和彙編 是不确定的(有些書本是反過來的)
包含頭檔案的作用:
// 定義一個變量a,類型為整型
int a;
預處理: 宏定義
(其實是把左邊的放到右邊了)
*其實可以分步編譯:
怎麼記呢? esc iso
gcc -e hello.c -o hello.i
預處理:在包含頭檔案的地方把頭檔案放進來。
(頭檔案展開)
編譯:gcc -s hello.i -o hello.s
(已經是彙編語言了,生成了彙編檔案)
gcc -c hello.s -o hello.o
(已經是目标檔案了,還需要連結一些庫什麼的)
gcc hello.o -o hello
(現在就可以運作了)
ldd hello 呈現出需要哪些動态庫
windows:
dependency walker軟體(用這個軟體檢視一下 需要哪些動态庫)
linux:
可以用ldd指令來檢視
19 課堂答疑:動态庫的作用
寫的程式,通常都需要函數調用
1)函數調用類似于點菜
2)函數調用可能需要連結動态庫,隻是點菜,菜從廚房(動态庫)實作
如果把qt的環境變量給關閉了,就不能運作了。
20 gcc編譯過程總結
第一步 預處理 替換.h檔案 這裡沒有文法檢查
第二步 編譯 生成彙編語言
第三步 彙編 生成二進制代碼
第四步 連結 對外部的庫進行連結
21 交換檔案說明
比如寫一個檔案寫了一半沒有儲存關機了,
然後重新 vi 這個檔案的時候會報下面這個錯
交換檔案說明:
1) vi寫檔案,沒有儲存就關閉,自動生成一個字尾為.swp交換檔案,
儲存了前面寫的内容
大寫字母r來恢複。
但是:這樣恢複之後每次打開還是會提示這個,需要把這個減緩檔案删除
2)先恢複,再删除
ls -a rm .xxxx.c.swp -rf
22 寄存器介紹
23 vs反彙編
vs 嵌套彙編代碼(了解)
vs反彙編:
1.設定斷點
2.
上面的是windows的示例,
如果在linux下就直接 gcc -esc -iso。。。那一大堆生成hello.s就可以檢視了
不同的編譯器 不同的平台還會有所差異。
24 vs的使用
用vs進行c開發時,微軟認為有些操作是不安全的,比如:
解決方法1:
25 qt的使用
通過vs、qt編譯代碼,必須建立工程(項目),把代碼加載到工程後才能編譯運作。