目錄
- 一.typedef 簡介
- 1.typedef 簡化復雜的型別宣告
- A.定義普通變數
- B.定義函式指標
- C.定義結構體
- 2.定義與平臺無關的型別
- 1.typedef 簡化復雜的型別宣告
- 二.define 簡介
- 三.typedef 和 define 區別
- 1.執行時間不同
- 2.功能有差異
- 3.作用域不同
- 四.猜你喜歡
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.typedef 簡介
C 語言 typedef 是為現有的型別起一個別名,使用起來更加的方便,注意:它并沒有產生新的型別;
1.typedef 簡化復雜的型別宣告
A.定義普通變數
typedef int REAL_TYPE;
REAL_TYPE a = 10; //等價 int a = 10;
printf("a=%d",a);
B.定義函式指標
//宣告了一個回傳 bool 型別并帶有兩個(int和double)形參的
typedef bool (*FuncPointer)(int, double);
函式的指標型別FuncPointer
FuncPointer pFunc; //宣告了一個FuncPointer型別的函式指標物件pFunc
C.定義結構體
在 C 語言中,如果定義結構體的時候沒有宣告 typedef,宣告結構體變數時就必須用struct 來宣告,否則會報錯;示例如下:
//不使用typedef
struct _Person
{
string name;
int age;
float height;
};
struct _Person person; //C語言中必須添加struct,C++可以不添加struct
//使用typedef
typedef struct _Person
{
string name;
int age;
float height;
}Person;
Person person;//使用typedef定義變數更加簡單
在 C++ 中定義結構體時即便沒有宣告 typedef ,宣告變數不添加 struct 也可以正常使用;
2.定義與平臺無關的型別
用 typedef 來定義與平臺無關的型別,例如:同一份代碼需要在 Linux / Mac / windows 使用,而每個平臺都有不同的差異,可以通過以下方式解決:
#ifdef __APPLE__ //MAC平臺:REAL_TYPE表示 int 型別
typedef int REAL_TYPE;
#elif WIN32 //Windows平臺:REAL_TYPE表示 int 型別
typedef double REAL_TYPE;
#else //Linux平臺:REAL_TYPE表示 bool 型別
typedef bool REAL_TYPE;
#endif
重上面代碼可以看出,在不同的平臺定義 REAL_TYPE 變數時,對應的資料型別都不一樣,重而可以達到根據平臺的差異性自定義設定的問題!
二.define 簡介
C 語言中,可以用 #define 定義一個識別符號來表示一個常量/函式,用 #define 定義識別符號的一般形式為:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 typedef 和 define 區別
//@Time:2021/06/27 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
//定義常量
#define MAX_VALUE 100 //定義整型變數MAX_VALUE值為100
#define USER_NAME "huge" //定義字串變數USER_NAME值為"huge"
#define PI 3.1415926 //定義浮點數變數PI值為3.1415926
//定義簡單函式
#define MAX(a,b) (a>b)?a:b //取兩個數最大值
#define MIN(a,b) (a<b)?a:b //取兩個數最小值
//定義復雜多行的函式
#define MACRO(arg1, arg2) do { \
\
stmt1; \
stmt2; \
\
} while(0)
關鍵是要在每一個換行的時候加上一個 "\ "
凡是以#開頭的均為預處理指令,預處理又叫預編譯,預編譯不是編譯,而是編譯前的處理,這個操作是在正式編譯之前由系統自動完成的,
使用
define定義一個多行的復雜函式,關鍵是要在每一個換行的時候加上一個\;
三.typedef 和 define 區別
1.執行時間不同
關鍵字 typedef 在編譯階段有效,由于是在編譯階段,因此 typedef 有型別檢查的功能,
[#define](https://www.codersrc.com/archives/8894.html) 則是宏定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字串替換,而不進行任何檢查,凡是以 # 開頭的均為預處理指令,預處理又叫預編譯,預編譯不是編譯,而是編譯前的處理,這個操作是在正式編譯之前由系統自動完成的,
2.功能有差異
typedef用來定義型別的別名,定義與平臺無關的資料型別,與struct的結合使用等,#define不只是可以為型別取別名,還可以定義常量、變數、編譯開關等,
3.作用域不同
#define 沒有作用域的限制,只要是之前預定義過的宏,在以后的程式中都可以使用;
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 typedef 和 define 區別
//@Time:2021/06/27 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
void func1()
{
#define HW "HelloWorld";
}
void func2()
{
string str = HW;
cout << str << endl;
}
typedef有自己的作用域;
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 typedef 和 define 區別
//@Time:2021/06/27 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
void func1()
{
typedef unsigned int UINT;
}
void func2()
{
UINT uValue = https://www.cnblogs.com/shuopython/p/5;//error C2065:'UINT' : undeclared identifier
}
四.猜你喜歡
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 指標宣告和定義
- C 語言 指標 p++ / p–
- C 語言 p++/§++/_(p++)/_p++
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 指標陣列和陣列指標區別
- C 語言 空指標 NULL
- C 語言 void 指標
- C 語言 野指標
- C 語言 函式值傳遞和址傳遞
- C 語言 函式預設引數
- C 語言 函式不定長引數
- C 語言 函式指標
- C 語言 指標函式
- C 語言 回呼函式 callback
- C 語言 typedef
- C 語言 define 定義常量
- C 語言 define 防止頭檔案重復包含
- C 語言 define 定義函式
- C 語言 define 定義函式(多行書寫)
- C 語言 typedef 和 define 區別
未經允許不得轉載:猿說編程 ? C 語言 typedef 和 define 區別
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297699.html
標籤:C
