嵌入式C學習次二次任務
技術標籤:c++
Typedef
Typedef關鍵字,作用是給一種資料型別定義一個新名字。這裡的資料型別包括內部資料型別(int,char等基本資料型別)和自定義的資料型別(struct等)。使用typedef起別名有兩個好處,一是給變數一個易記、含義明確的新名字,二是簡化一些比較複雜的型別宣告(如struct student中的struct)。
typedef struct student{
char name[8];
int age;
char sex[2];
}xuesheng;
xuesheng stu;
當使用typedef定義結構體後,當使用這個新的結構型別時,可以省略struct,使用別名完成變數stu的建立
結構體
參考連結:C語言結構體淺見
不使用typedef定義結構體說明:
//定義一個名為student的結構體
struct student{
char name[8];
int age;
char sex[2];
};
struct關鍵字用來宣告結構體,花括號內的結構體成員可以任意發揮(若存在相同的資料型別,也可以簡寫:int a,b,c;)。
在完成了對結構體student的定義後,編譯後並沒有為其分配空間,下還需要去使用這個新的資料型別。
在上面提到student這個識別符號只是類似於基本資料型別的型別名稱,因為要想完全在概念上等價,我們需要在前面加上struct關鍵字,即struct student是一個整體,不可以省去struct:
struct student stu;
現在,我們已經成功定義了一個變數stu,系統為其分配了該資料型別(結構體)所需要的儲存空間。
以上兩部分還可以簡寫在一起:
struct student{
char name[8];
int age;
char sex[2];
}stu;//將stu寫在尾綴,構造結構體的同時完成了對結構體變數的定義,如需多個結構體變數,可以使用逗號分隔開
定義結構體的時候,還可以省略結構體的名稱,定義匿名結構體:
struct{
char name[8];
int age;
char sex[2];
} stu1,stu2,stu3;
巨集定義
巨集定義的定義:
巨集定義的作用有點類似於類似於全域性變數,程式在預編譯的時候會自動將巨集名替換,但它又和全域性變數有一些不同:
- 巨集定義在編譯期間即會使用並替換,而全域性變數要到執行時才可以。
- 巨集定義的只是一段字元,在編譯的時候被替換到引用的位置。在執行中是沒有巨集定義的概念的。而變數在執行時要為其分配記憶體。
- 巨集定義不可以被賦值,即其值一旦定義不可修改,而變數在執行過程中可以被修改。
- 巨集定義只有在定義所在檔案,或引用所在檔案的其它檔案中使用。 而全域性變數可以在工程所有檔案中使用,只要再使用前加一個宣告就可以了。換句話說,巨集定義不需要extern
巨集定義的方法:
#define 識別符號 字串
其中,字串可以是常數、表示式、格式串等符號常量
例如:
#define PI 3.141592654
還可以用用 #undef xxx 來取消巨集xxx的定義
巨集函式的適用範圍:
- 一般來說,用巨集來代表簡短的表示式比較合適。
- 在考慮效率的時候,可以考慮使用巨集,或者行內函數。
- 還有一些任務根本無法用函式實現,但是用巨集定義卻很好實現。比如引數型別沒法作為引數傳遞給函式,但是可以把引數型別傳遞給帶參的巨集。
條件編譯
—般情況下,C語言源程式中的每一行程式碼.都要參加編譯。但有時候出於對程式程式碼優化的考慮.希望只對其中一部分內容進行編譯.此時就需要在程式中加上條件,讓編譯器只對滿足條件的程式碼進行編譯,將不滿足條件的程式碼捨棄,這就是條件編譯。
條件編譯的具體用法:參考網址
(1)#ifdef、#else、#endif指令
#ifdef MAVIS
#include "horse.h" //如果已經用#define 定義了MAVIS,則執行這裡的命令
#define STABLES 5
#else
#include "cow.h" //如果已經沒有用#define 定義了MAVIS,則執行這裡的命令
#define STABLES 15
#endif
(2)#ifndef和#endif指令
這兩個指令配合起來常用於標頭檔案中,防止重複定義。一般地,當某個檔案包含了幾個標頭檔案,而且每個標頭檔案可能包含了相同的巨集時,使用#ifndef則可以防止對該巨集重複定義。此時,第一個標頭檔案中的定義變成了有效定義,而其他標頭檔案中的定義則被忽略。
#ifndef NAMES_H_
#define NAMES_H_
#define SLEN 32
//結構申明
struct names_st
{
char first[SLEN];
char last[SLEN];
}
#endif
(3)#if和#endif指令
#if指令更像常規的C中的if;#if後面常跟常量整數表示式。如果表示式為非零值,則表示式為真。在該表示式中,可以使用邏輯運算子和關係運算符。
#if SYS == 1
#include "ibm.h" //條件表示式滿足,則執行這裡的命令
#endif
#if 0
程式碼 //常用來遮蔽某段程式碼
#endif
(4) #和define之間有空格
#define = # define
(5) #if defined X
#ifdef X = #if defined X