1. 程式人生 > 其它 >嵌入式C學習次二次任務

嵌入式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;

巨集定義

巨集定義的定義:

巨集定義的作用有點類似於類似於全域性變數,程式在預編譯的時候會自動將巨集名替換,但它又和全域性變數有一些不同:

  1. 巨集定義在編譯期間即會使用並替換,而全域性變數要到執行時才可以。
  2. 巨集定義的只是一段字元,在編譯的時候被替換到引用的位置。在執行中是沒有巨集定義的概念的。而變數在執行時要為其分配記憶體。
  3. 巨集定義不可以被賦值,即其值一旦定義不可修改,而變數在執行過程中可以被修改。
  4. 巨集定義只有在定義所在檔案,或引用所在檔案的其它檔案中使用。 而全域性變數可以在工程所有檔案中使用,只要再使用前加一個宣告就可以了。換句話說,巨集定義不需要extern

巨集定義的方法:

			#define 識別符號 字串

其中,字串可以是常數、表示式、格式串等符號常量
例如:

#define PI 3.141592654

還可以用用 #undef xxx 來取消巨集xxx的定義

巨集函式的適用範圍:

  1. 一般來說,用巨集來代表簡短的表示式比較合適。
  2. 在考慮效率的時候,可以考慮使用巨集,或者行內函數。
  3. 還有一些任務根本無法用函式實現,但是用巨集定義卻很好實現。比如引數型別沒法作為引數傳遞給函式,但是可以把引數型別傳遞給帶參的巨集。

條件編譯

—般情況下,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