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