Linux C语言编程基本原理与实践
重識(shí)C語(yǔ)言
C語(yǔ)言是一種通用的, 面向過(guò)程的編程語(yǔ)言, 在系統(tǒng)與應(yīng)用軟件的開(kāi)發(fā)應(yīng)用較廣
是人類(lèi)和計(jì)算機(jī)交流的一種方式
ANSI C: 是C語(yǔ)言的標(biāo)準(zhǔn), 為了避免各開(kāi)發(fā)商用的C語(yǔ)言語(yǔ)法的差異
C語(yǔ)言的特點(diǎn): 簡(jiǎn)單, 快速, 高性能, 兼容性好, 功能強(qiáng)大, 易于學(xué)習(xí)
C語(yǔ)言適合做什么
Linux嵌入式, 小工具(命令行下的cd, ls之類(lèi)的命令) 小巧靈活,語(yǔ)法簡(jiǎn)單,適合做小工具
與硬件打交道的程序: 操作系統(tǒng), ARM嵌入式, 單片機(jī)編程以及Arduino編程等等
對(duì)性能要求較高的應(yīng)用程序: NGINX(C)的并發(fā)量 = Apache(C ) * 10
C適合領(lǐng)域
小工具(語(yǔ)法簡(jiǎn)單)
和硬件打交道的程序 ARM嵌入式,單片機(jī),Arduino編程(有指針,可操作內(nèi)存)
有高性能要求的程序
nginx:c apache:c
linux嵌入式
開(kāi)發(fā)環(huán)境與配置:
C語(yǔ)言是隨著UNIX誕生而產(chǎn)生的一門(mén)編程語(yǔ)言
Mac電腦是Unix內(nèi)核; Windows下可以安裝Linux虛擬機(jī)
Ubuntu:
Ubuntu和CentOS是較為常用的Linux發(fā)行版本, 個(gè)人電腦用Ubuntu更好
Ubuntu的kylin版對(duì)中文支持很好
amd64版: AMD當(dāng)初率先推出64位CPU, 所以Ubuntu把64位CPU型號(hào)定義為amd64(Intel照用), 一直沿用到現(xiàn)今; 32位用x86
LTS版: 長(zhǎng)時(shí)間的技術(shù)支持版本
裝Ubuntu系統(tǒng)可以選擇雙系統(tǒng), 也可在原來(lái)的Windows電腦上裝虛擬機(jī)
PS: 盡量在Linux環(huán)境下開(kāi)發(fā)C語(yǔ)言程序
常用指令
終端編輯器:emacs vim
安裝軟件:sudo apt install 【軟件名】
更新軟件:sudo apt update
Ctrl Alt T:打開(kāi)終端
cd ~?:進(jìn)入當(dāng)前用戶的根目錄
pwd?:查看當(dāng)前所在路徑
ls?:當(dāng)前章目錄包含哪些文件
ls -l?:顯示當(dāng)前文件的類(lèi)型,權(quán)限,創(chuàng)建時(shí)間,名字
ls -al或ll:顯示隱藏文件
如果前面是d就是文件夾,-就是普通類(lèi)型的文件
touch **?:創(chuàng)建字符型文件
rm **?:刪除
mkdir **?:創(chuàng)建目錄(文件夾)
vi **?:打開(kāi)(進(jìn)入)文件
vi 一個(gè)不存在的文件,進(jìn)入后無(wú)法輸入內(nèi)容,因當(dāng)前在命令模式下;按字符i,可進(jìn)入INSERT插入模式,就可輸入內(nèi)容,按Esc返回命令模式;
在命令模式下:
:w?:保存該文件
:q?:退出
i?:當(dāng)前光標(biāo)前面插入字符
Shift i?:跳到本行行首插入字符
a?:當(dāng)前光標(biāo)后面插入字符
Shift a?:跳到本行末尾插入字符
o?:在當(dāng)前下一行插入字符
Shift o?:在當(dāng)前上一行插入字符
x?:刪除當(dāng)前光標(biāo)所處字符
d d?:刪除整行
Linux下最好用的文本編輯器: emacs, vim
cc -v(gcc -v): 查看編譯器版本
apt-get是一條linux命令,適用于deb包管理式的操作系統(tǒng),主要用于自動(dòng)從互聯(lián)網(wǎng)的軟件倉(cāng)庫(kù)中搜索、安裝、升級(jí)、卸載軟件或操作系統(tǒng)。
clear:清潔屏幕
Linux下第一個(gè)C程序
linux下一般不用void main,最新c語(yǔ)言標(biāo)準(zhǔn),int main
#include?int?main() {????printf("hello,world!\n");????return?0; }1234567cc?a.c1默認(rèn)會(huì)為我們編譯并生成可執(zhí)行文件a.out(可讀可寫(xiě)可執(zhí)行)
./表示當(dāng)前路徑下,
./a.out?執(zhí)行當(dāng)前路徑下的a.out文件
r表示可讀?w表示可寫(xiě)?x表示可執(zhí)行
三組重復(fù)的順序?yàn)椤眲?chuàng)建者”,”用戶組”,”任意其他用戶”
多個(gè)源文件分而治之
c語(yǔ)言是一個(gè)結(jié)構(gòu)化的程序語(yǔ)言,是支持多函數(shù)的。程序可由若干個(gè)函數(shù)組成。
vim?hello.c1最原始版本的實(shí)現(xiàn)(hello.c):
#include?int?max(int?a,?int?b) {????if(a>b){????????return?a;??????}else{????????return?b;} }int?main() {????int?a1?=?33;????int?a2?=?21;????int?maxNum?=?max(a1,a2);????printf("the?max?value?is?%d\n",maxNum);????return?0; }12345678910111213141516171819我們的stdio.h是在我們的user/include中被內(nèi)置了
在編寫(xiě)max函數(shù)時(shí)對(duì)齊,編寫(xiě)內(nèi)部時(shí)括號(hào)進(jìn)行縮進(jìn)對(duì)齊。
附加知識(shí): vim分屏顯示
:sp 文件名?//創(chuàng)建(打開(kāi))新文件
上屏:?ctrl w 上箭頭
下屏:?ctrl w 下箭頭
打開(kāi)行號(hào)?:set nu
剪切:(最后一行行數(shù)) dd
粘貼:p
//這兩個(gè)不用點(diǎn)冒號(hào)
關(guān)閉行號(hào):set nonu
如果就是上圖代碼直接編譯會(huì)報(bào)錯(cuò),這是一個(gè)未聲明的函數(shù)。
有兩種分離方案:
第一種是int max(int a,int b);,在hello.c中聲明該方法,然后編譯的時(shí)候需要加上max.c
一種是#include "max.c"?然后編譯的時(shí)候就不需要加上max.c一起編譯
版本1:
0-hello.c:
#include?int?max(int?a,int?b);int?main() {????int?a1?=?33;????int?a2?=?21;????int?maxNum?=?max(a1,a2);????printf("the?max?value?is?%d\n",maxNum);????return?0; }12345678910110-max.c:
int?max?(int?a,?int?b) {????if(a>b){????????return?a;}else{????????return?b;} }12345678編譯命令:
gcc?0-hello.c?0-max.c?-o?0-hello.out1如果不加上0-max.c一起編譯,會(huì)出現(xiàn)錯(cuò)誤
gcc?0-hello.c?-o?0-hello.out/tmp/cc8GuaAH.o:在函數(shù)‘main’中:0-hello.c:(.text 0x21):對(duì)‘max’未定義的引用collect2:?error:?ld?returned?1?exit?status1234版本2
1-hello.c:
#include?#include?"0-max.c"int?main() {????int?a1?=?33;????int?a2?=?21;????int?maxNum?=?max(a1,a2);????printf("the?max?value?is?%d\n",maxNum);????return?0; }12345678910110-max.c與原來(lái)的一致
編譯命令:
gcc?1-hello.c?-o?1-hello.out1如果此時(shí)多加了0-max.c一起編譯
gcc?1-hello.c?0-max.c?-o?1-hello.out /tmp/ccjcCmVa.o:在函數(shù)‘max’中:0-max.c:(.text 0x0):?`max'被多次定義 /tmp/cclIxMtD.o:1-hello.c:(.text 0x0):第一次在此定義 collect2:?error:?ld?returned?1?exit?status12345終端下:
gcc 文件名.c -o 命名.out
生成.out并命名
#include <>表示在預(yù)裝的庫(kù)里查找
#include "max.c"表示在當(dāng)前目錄內(nèi)查找文件
include "max.c"相當(dāng)于把整個(gè)函數(shù)復(fù)制進(jìn)來(lái)了。效果等同于寫(xiě)進(jìn)來(lái)
wqa?是將多個(gè)文件一起保存
頭文件與函數(shù)定義分離
把函數(shù)的聲明和定義分離開(kāi)來(lái)
代碼沒(méi)有main函數(shù)不能執(zhí)行,main是入口。
.h 頭文件
.o 編譯之后的中間文件
.c 源代碼
加快編譯速度
gcc?-c?0-max.c?-o?0-max.o1將max.c變成max.o之后,我們需要把hello.c中的include注釋掉并添上方法聲明
#include?//#include?"0-max.c"int?max(int?a,int?b);123可讀可寫(xiě)不可執(zhí)行,max.o相當(dāng)于計(jì)算器對(duì)于源代碼進(jìn)行了翻譯,變成計(jì)算機(jī)可識(shí)別的機(jī)器碼
gcc?0-max.o?1-hello.c?-o?1-hello.out1新建一個(gè)min.c
int?min?(int?a,?int?b) {????if(a<b){????????return?a;}else{????????return?b;} }12345678hello.c中進(jìn)行minNum的調(diào)用
#include?//#include?"0-max.c"int?max(int?a,int?b);int?min(int?a,int?b);int?main() {????int?a1?=?33;????int?a2?=?21;????int?maxNum?=?max(a1,a2);?int?minNum?=?min(a1,a2);????printf("the?max?value?is?%d\n",maxNum);?printf("the?min?value?is?%d\n",minNum);????return?0; }123456789101112131415編譯命令:
gcc?-c?min.c?-o?min.o1gcc?0-max.o?min.o?1-hello.c?-o?2-hello.out1加快編譯速度。不會(huì)再修改的函數(shù),公共框架和公共類(lèi)編譯生成靜態(tài)庫(kù)。
gcc的編譯流程分為4步:
總結(jié)
以上是生活随笔為你收集整理的Linux C语言编程基本原理与实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 电脑百度云下载加速器(百度云加速器电脑版
 - 下一篇: 30分钟了解C 11新特性