歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Unix/Linux系統下的高級C編程的主要內容1、20160531

Unix/Linux系統下的高級C編程的主要內容1、20160531

日期:2017/3/3 12:17:41   编辑:Linux技術

1)Unix/Linux系統的基本概述

2)Unix/Linux系統下的編程基礎以及開發方式

3)Unix/Linux系統下的內存管理技術

4)Unix/Linux系統下的文件管理和目錄操作

5)Unix/Linux系統下的進程管理

6)Unix/Linux系統下的信號處理

7)Unix/Linux系統下的進程間通信

8)Unix/Linux系統下的網絡編程

9)Unix/Linux系統下的多線程編程

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

今天內容:

1)Unix/Linux系統的簡介(了解)

2)gcc編譯器的基本使用

3)多文件結構的編程

4)預處理指令

5)環境變量的概念和使用

6)庫文件的概念和使用

-------------------------------------------------

1.Unix/Linux系統的簡介

1.1Unix系統的簡介

在1969年左右,使用的是匯編語言編寫操作系統,編寫以及維護都不方便,湯普遜發明了一門語言叫做B語言,丹尼斯裡奇在B語言的基礎上 做了修改和擴展,改名為:new B語言,後來改名為C語言。

C語言 誕生於1972年,一直在編程語言排行榜中占據著重要的地位

Unix操作系統誕生於1970或1971年,具有三個特點,具有多用戶、多任務以及支持多種處理器的特點

1.2 Linux系統的簡介

Linux系統是一款自由免費開放源代碼的類Unix操作系統,早期Linux只是用於表示系統的內核,後來大家都習慣於將以Linux作為內核的操作系統統稱為Linux系統。Linux系統的標志是企鵝

2.gcc的基本使用

2.1基本概念

原名叫做GUN C Compiler (GUN C語言編譯器),只是用於編譯C語言,後來做了一些擴展,支持C++、OC等語言的編譯器,因此改名為:GUN Compiler Collection (GUN 編譯器套間/集合)

2.2基本功能

gcc xxx.c 主要包含以下4部分功能:

(1)預處理:主要實現對頭文件的包含以及宏替換等

(2)編譯:主要將高級語言轉換為匯編語言

(3)匯編:主要講匯編語言翻譯成機器指令,得到目標文件

(4)鏈接:主要將目標文件和庫文件進行鏈接,生成可執行文件

2.3比較常見的編譯選項(分別調試)-E 進行預處理,-o 制定輸出文件名

gcc -E xxx.c -o xxx.i

預處理的結果默認輸出到控制台,使用 gcc -E xxx.c -o xxx.i將預處理結果定位到xxx.i文件中,預處理之後的文件主要包含:頭文件、類型的別名、各種函數的聲明等等。

-S 進行編譯處理,生成匯編文件xxx.s gcc -S xxx.i

-c 進行匯編處理,生成目標文件xxx.o gcc -c xxx.s

gcc xxx.o 表示連接處理,生成可執行文件a.out

gcc -E xxx.c -o xxx.i

=>預處理,生成.i文件

gcc -S xxx.i / xxx.c

=>編譯,生成.s 文件

gcc -c xxx.s / xxx.i / xxx.c

=>匯編,生成 .o 文件

gcc xxx.o / xxx.i / xxx.c / xxx.s

=>鏈接,生成a.out 文件

2.4 熟悉的選項

-std 主要用於指定編譯時遵循的C標准

-Wall 主要用於盡可能多的產生警告信息

-Werror 主要用於將警告當做錯誤進行處理

2.5了解的選項

gcc -v

-v 主要用於查看gcc的版本信息

-g 主要用於生成調試信息(gdb 調試)

-o 主要用於進行優化處理

gcc -x c++ text.c -lstdc++

-x 主要用於顯示指定源代碼的編程語言

2.6擴展的選項

man gcc 查看gcc 更多的選項的信息

星際譯王 英文詞典

2.7常見的文件後綴

.c 源文件

.i 預處理之後的文件

.s 匯編文件

.o 目標文件

.a 靜態庫文件

.so 共享庫文件

3.1多文件的結構的編程

.h 頭文件主要存放結構體的定義,函數的聲明等等

.c 源文件主要存放變量、函數的定義等等

.a 靜態庫文件主要對功能代碼的打包

.so 共享庫文件主要對功能代碼的打包

3.2頭文件中的詳細內容

第一部分內容、頭文件的衛士

#ifndef xxx_H

#defin xxx_H

#endif

第二部分內容、包含其他的頭文件

#include<stdio.h>

#include<stdlib.h>

第三部分內容、宏定義

#define PI 3.1415926

第四部分內容、數據類型的定義,給類型起別名

typedef struct Node

{

int data;

struct Node* next;

}Node;

第五部分內容、變量/函數的聲明

extern/*外部的*/ int num;

void show (void);

例如:vim circle.h//計算圓的面積

#ifdef CIRCLE_H //頭文件的衛士

#define CIRCLE_H

#include<stdio.h>//包含其他頭文件

#define PI 3.14//宏定義

double circle_area (double r);//聲明計算圓形面積的函數

#endif

------------------

gcc -c circle.h

刪除*.gch文件

cp circle.h circle.c

vim circle.c

#include"circle.h"

double circle_area(double r)定義計算圓形面積的函數

{

return PI*r*r;

}

gcc -c circle.c

刪除*.o 文件

vim main.c

#include"circle.h"

int main ()

{

printf("圓形面積是:%lf\n",circle_area(5));

}

gcc *.c

------------------------------------------------------------------------------------

主要;變量/函數的定義不要放在頭文件中,避免出現變量/函數的重定義的錯誤

4.預處理命令

4.1復習預處理指令

#include 主要用於包含頭文件

#define 進行宏定義

#undef 取消宏定義

#if 如果

#ifdef 如果定義

#ifndef 如果沒有定義

#elif 否則如果

#else 否則

#endif 結束如果

4.2學習新的預處理指令

#line 整數n(了解)

=>表示從下一行開始 行號變更為第n行

#warning 字符串

=>表示產生一個警告信息

#error

=>表示產生一個錯誤信息

#if 主要用於在編譯階段進行條件的判斷

if 主要用於在運行期間進行條件的判斷

#pragma GCC dependency "指定文件名"文件名 ;指定的文件、最後一次的修改時間、晚於當前文件,則產生警告信息(監控)

=> 表示當前文件依賴於指定的文件名,如果這個指定的文件最後一次修改時間晚於當前文件,則產生警告信息

#pragma GCC poison 標識符

=> 設置指定的標識符為毒藥

#include<stdio.h>

#define GOTO goto //在goto設置為毒藥後還想用goto,用宏定義漫天過海使用goto

#pragma GCC poison goto //將標識符goto設置為毒藥,一旦使用goto就會報錯

int main(void)

{

goto ok; //表示調到 ok;這一行

printf("main函數開始執行\n");

ok;

printf("main函數結束\n");

return 0;

}

:wq

、、、、、、、、、、、、

goto 命令可以構成死循環

no;

goto ok;

ok;

goto no;

、、、、、、、、、、、、、、

#pragma pack (整數n)

=>表示按照n的倍數進行對齊和補齊

//#pragma pack(整數n)的使用,調整對齊和補齊的方式就是為了節省內存空間

#include<stdio.h>

//#pragma pack(2) //修改默認的對齊補齊方式,按照2的倍數進行對齊和補齊,打印輸出為8,

//#pragma pack(1) 按照1的倍數進行對齊補齊,打印輸出為6;

//#pragma pack(3) error 必須是2的較小次方;

//#pragma pack(8)超過4按照4的倍數進行處理,並且對齊和補齊的方式必須是2的較小次方

int main (void)

{

struct S

{char c1;//一個字節

int i;//四個字節

char c2;//一個字節

};

printf("sizeof(struct S)=%d\n",sizeof (struct S));//12 結構圖默認的對齊與補齊的方式是4的整數倍,打印輸出為12

return 0;

}:wq

4.3預定義宏

__BASE_FILE__ 獲取正在編譯的文件名  %s

__FILE__      獲取當前宏所在的文件名 %s

__LINE__      獲取當前宏所在的行號  %d

__FUNCTION__  獲取當前宏所在的函數名 %s

__DATE__      獲取日期        %s

__TIME__      獲取時間        %s

作業:編程打印預定義宏的值

明日預報:

1環境變量的概念和使用

2庫文件的概念和使用

3C語言中的錯誤處理

Copyright © Linux教程網 All Rights Reserved