Typedefc語言
⑴ c語言typedef定義
第一種在C語言中要使用struct
Stack全稱,C++中可以使用Stack
第二種是給結構體類型(是類型)起個別名。在C火C++中都可以使用Stack類型定義
本質上沒有區別~~~~~~~
typedef是給類型起別名的·~你第一種後面沒有跟別名,所以就只是一般的定義結構體~~
⑵ C語言.typedef是函數還是啥
typedef
不是函數,是關鍵詞,作用是定義類型。例如:
typedef
double
REAL;
REAL
x;
就等於
double
x;typedef
char
BUFFER[256];
BUFFER
b;
就等於
char
b[256];typedef
struct
{int
year;
int
month;
int
day}
DATE;
DATE
today;
就等於
struct
{int
year;
int
month;
int
day}
today;定義新類型名的目的是為了讓程序更容易理解。
⑶ c語言中為什麼要用到typedef
類型定義,它就和define相對應
define是把一個自己起的名字的常量定義為代替它的另一個常量來用
typedef是把一個自己起的名字的類型用已經有的類型代替使用,如:
typedefinttype1;
之後如果有type1i;系統則理解為inti;
⑷ c語言 typedef
使用typedef定義的變數類型其作用范圍限制在所定義的函數或者文件內。但是想在其他文件里也使用typedef定義的變數類型,常把typedef聲明單獨放一個文件里(導入頭文件),在用的時候用#include命令把這個文件導進來。
typedef的作用是,聲明新的類型名來代替原有的類型名,C語言中習慣上把用typedef聲明的類型用大寫字母表示。
例子:
typedef int p; //將p定義為int類型,定義"p i;" = 「int i;」
typedef int p[10]; //將p定義為int[10]類型,定義"p i;" = 「int i[10];」
typedef int* p; //將p定義為int類型,定義"p i;" = 「int *i;」
typedef struct stu p; //將p定義為結構體stu類型,定義"p i;" = 「struct stu i;」
typedef int p(int , int); //將p定義為int __(int ,int)類型的函數,定義"p i;" = 「int i(int, int);」
⑸ C語言中的typedef是什麼意思啊
typedef是在計算機編程語言中用來為復雜的聲明定義簡單的別名,它與宏定義有些差異。它本身是一種存儲類的關鍵字,與auto、extern、mutable、static、register等關鍵字不能出現在同一個表達式中。
它的作用是為一種數據類型定義一個新名字,比如,typedef int INTERGER 相當於用INTERGER來代表int類型; 或 typedef float REAL 用REAL來代表float。需要注意的是,為了「見名知意」,請盡量使用含義明確的標識符,並且盡量大寫。
(5)Typedefc語言擴展閱讀
typedef 有另外一個重要的用途,那就是定義機器無關的類型,例如,你可以定義一個叫 REAL 的浮點類型,在目標機器上它可以獲得最高的精度:
typedef long double REAL;
在不支持 long double 的機器上,該 typedef 看起來會是下面這樣:
typedef double REAL;
並且,在連 double 都不支持的機器上,該 typedef 看起來會是這樣:
typedef float REAL;
你不用對源代碼做任何修改,便可以在每一種平台上編譯這個使用 REAL 類型的應用程序。唯一要改的是 typedef 本身。
在大多數情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現。不是嗎? 標准庫廣泛地使用 typedef 來創建這樣的平台無關類型:size_t,ptrdiff 和 fpos_t 就是其中的例子。
此外,象 std::string 和 std::ofstream 這樣的 typedef 還隱藏了長長的,難以理解的模板特化語法,例如:basic_string,allocator> 和 basic_ofstream>。
⑹ C語言typedef
typedef 是給一個已存在的變數類型,定義一個別名,使代碼可讀性更高,使用起來更方便。
struct __abc {
struct __abc *ptr;
char *str;
int i;
}
這是定義一個結構體 __abc ,
typedef struct __abc abc ; //定義一個別名abc與struct __abc 是一個意思。
typedef可以和結構體定義寫在一起,形成題目中的樣子,與上面的分步定義是相同的。
⑺ 在C語言中typedef是什麼意思干什麼用的
typedef是C/C++常用語法,typedef作用,歸結起來,可以分為四種:
1、定義一種類型名
常規的應用中,想要定義兩個字元指針,寫下如下代碼: char *a, b
(1)char* a,b;
(2)char c='m';
(3)a=&c;
(4)b=&c;
上述代碼是錯誤的,只有a為字元指針,b仍舊為字元變數。通過#define進行宏定義,仍然是無效的,因為宏定義僅僅是字元替換。
以下則可行:
(1)typedef char* PCHAR;
(2)PCHAR pa, pb;
2、用於struct結構體
(1)#include <stdio.h>
(2)struct tagPOINT1
(3){
(4)int x;
(5)int y;
(6)};
(7)int main()
(8){
(9)tagPOINT1 p1,p2;//此句編譯無法通過
(10)//錯誤信息:error: unknown type name 'tagPOINT1'
(11) //環境:Gcc 4.8.1
(12)}
必須採用如下定義;
(1)struct tagPOINT1 p1,p2;//必須有關鍵字 struct
(2)採用typedef,則可以省掉結構體定義時的struct
(3)ypedef struct tagPOINT
(4){
(5)int x;
(6)int y;
(7)}POINT;
(8)POINT p1; // 這樣就比原來的方式少寫了一個struct。
3、跨平台移植
程序編寫中,如果考慮到平台移植的因素,則需要從代碼中抽象出硬體層的差異,例如,變數所佔空間,端模式等等。
考慮一個浮點型變數,在不同的硬體平台上,所佔據的空間有可能不同,此時,可以採用typedef將其定義到單獨的頭文件內,該頭文件是純粹抽象硬體相關的內容:
(1)typedef float REAL;
(2)typedef short int INT16;
(3)typedef int INT32
(4)...
這樣的話,如果將來考慮到程序的移植,只需要修改該頭文件即可。
4、為復雜的聲明取別名
復雜的聲明形如:void (*b[10]) (void (*)());
意思:首先*b[10]為指針數組,它裡面的十個元素全是指針。到底是什麼指針呢,是一個返回類型為空,形參為空的函數指針。
這種復雜的聲明,可以用typedef進行簡化:
首先:聲明後面的函數指針:
(1)typedef void (pFunParam *)();
接著聲明前面的指針數組:
(1)typedef void (*pFunx)(pFunParam);
原聲明的最簡化版:
pFunx b[10];
本文檔在撰寫過程中,參考了網路博客typedef用法
裡面提到一個復雜的聲明:
(1)doube(*)() (*e)[9];
而然這個聲明在gcc下編譯時不通過的,按照作者的本意,似乎應該這樣聲明:
(1)double (*(*e)[9])();
e是一個指向9維數組的指針,數組內為函數指針,該函數指針形參為空,返回類型為double。
這樣的話,應該採用這樣的typedef來簡化聲明:
typedef (*(*ptr)[9])();
(7)Typedefc語言擴展閱讀
typedef為C語言的關鍵字,作用是為一種數據類型定義一個新名字。這里的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。
在編程中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。
⑻ C語言typedef是干嗎的
typedef 聲明,簡稱 typedef,為現有類型創建一個新的名字。比如人們常常使用 typedef 來編寫更美觀和可讀的代碼。所謂美觀,意指 typedef 能隱藏笨拙的語法構造以及平台相關的數據類型,從而增強可移植性和以及未來的可維護性。本文下面將竭盡全力來揭示 typedef 強大功能以及如何避免一些常見的陷阱。
如何創建平台無關的數據類型,隱藏笨拙且難以理解的語法?
使用 typedefs 為現有類型創建同義字。
定義易於記憶的類型名
typedef 使用最多的地方是創建易於記憶的類型名,用它來歸檔程序員的意圖。類型出現在所聲明的變數名字中,位於 ''typedef'' 關鍵字右邊。例如:
typedef int size;
此聲明定義了一個 int 的同義字,名字為 size。注意 typedef 並不創建新的類型。它僅僅為現有類型添加一個同義字。你可以在任何需要 int 的上下文中使用 size:
void measure(size * psz);
size array[4];
size len = file.getlength();
std::vector vs;
typedef 還可以掩飾符合類型,如指針和數組。例如,你不用象下面這樣重復定義有 81 個字元元素的數組:
char line[81];
char text[81];
定義一個 typedef,每當要用到相同類型和大小的數組時,可以這樣:
typedef char Line[81];
Line text, secondline;
getline(text);
同樣,可以象下面這樣隱藏指針語法:
typedef char * pstr;
int mystrcmp(pstr, pstr);
這里將帶我們到達第一個 typedef 陷阱。標准函數 strcmp()有兩個『const char *'類型的參數。因此,它可能會誤導人們象下面這樣聲明 mystrcmp():
int mystrcmp(const pstr, const pstr);
這是錯誤的,按照順序,『const pstr'被解釋為『char * const'(一個指向 char 的常量指針),而不是『const char *'(指向常量 char 的指針)。這個問題很容易解決:
typedef const char * cpstr;
int mystrcmp(cpstr, cpstr); // 現在是正確的
記住:不管什麼時候,只要為指針聲明 typedef,那麼都要在最終的 typedef 名稱中加一個 const,以使得該指針本身是常量,而不是對象。
代碼簡化
上面討論的 typedef 行為有點像 #define 宏,用其實際類型替代同義字。不同點是 typedef 在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文本替換。例如:
typedef int (*PF) (const char *, const char *);
這個聲明引入了 PF 類型作為函數指針的同義字,該函數有兩個 const char * 類型的參數以及一個 int 類型的返回值。如果要使用下列形式的函數聲明,那麼上述這個 typedef 是不可或缺的:
PF Register(PF pf);
Register() 的參數是一個 PF 類型的回調函數,返回某個函數的地址,其署名與先前注冊的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我們是如何實現這個聲明的:
int (*Register (int (*pf)(const char *, const char *)))
(const char *, const char *);
很少有程序員理解它是什麼意思,更不用說這種費解的代碼所帶來的出錯風險了。顯然,這里使用 typedef 不是一種特權,而是一種必需。持懷疑態度的人可能會問:"OK,有人還會寫這樣的代碼嗎?",快速瀏覽一下揭示 signal()函數的頭文件 ,一個有同樣介面的函數。
typedef 和存儲類關鍵字(storage class specifier)
這種說法是不是有點令人驚訝,typedef 就像 auto,extern,mutable,static,和 register 一樣,是一個存儲類關鍵字。這並是說 typedef 會真正影響對象的存儲特性;它只是說在語句構成上,typedef 聲明看起來象 static,extern 等類型的變數聲明。下面將帶到第二個陷阱:
typedef register int FAST_COUNTER; // 錯誤
編譯通不過。問題出在你不能在聲明中有多個存儲類關鍵字。因為符號 typedef 已經占據了存儲類關鍵字的位置,在 typedef 聲明中不能用 register(或任何其它存儲類關鍵字)。
促進跨平台開發
typedef 有另外一個重要的用途,那就是定義機器無關的類型,例如,你可以定義一個叫 REAL 的浮點類型,在目標機器上它可以i獲得最高的精度:
typedef long double REAL;
在不支持 long double 的機器上,該 typedef 看起來會是下面這樣:
typedef double REAL;
並且,在連 double 都不支持的機器上,該 typedef 看起來會是這樣:、
typedef float REAL;
你不用對源代碼做任何修改,便可以在每一種平台上編譯這個使用 REAL 類型的應用程序。唯一要改的是 typedef 本身。在大多數情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現。不是嗎? 標准庫廣泛地使用 typedef 來創建這樣的平台無關類型:size_t,ptrdiff 和 fpos_t 就是其中的例子。此外,象 std::string 和 std::ofstream 這樣的 typedef 還隱藏了長長的,難以理解的模板特化語法,例如:basic_string,allocator> 和 basic_ofstream>。
C語言中typedef用法
1. 基本解釋
typedef為C語言的關鍵字,作用是為一種數據類型定義一個新名字。這里的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。
在編程中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。
至於typedef有什麼微妙之處,請你接著看下面對幾個問題的具體闡述。
2. typedef & 結構的問題
當用下面的代碼定義一個結構時,編譯器報了一個錯誤,為什麼呢?莫非C語言不允許在結構中包含指向它自己的指針嗎?請你先猜想一下,然後看下文說明:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
答案與分析:
1、typedef的最簡單使用
typedef long byte_4;
給已知數據類型long起個新名字,叫byte_4。
2、 typedef與結構結合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
這語句實際上完成兩個操作:
1) 定義一個新的結構類型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct稱為「tag」,即「標簽」,實際上是一個臨時名字,struct 關鍵字和tagMyStruct一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。
我們可以用struct tagMyStruct varName來定義變數,但要注意,使用tagMyStruct varName來定義變數是不對的,因為struct 和tagMyStruct合在一起才能表示一個結構類型。
2) typedef為這個新的結構起了一個名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct實際上相當於struct tagMyStruct,我們可以使用MyStruct varName來定義變數。
答案與分析
C語言當然允許在結構中包含指向它自己的指針,我們可以在建立鏈表等數據結構的實現上看到無數這樣的例子,上述代碼的根本問題在於typedef的應用。
根據我們上面的闡述可以知道:新結構建立的過程中遇到了pNext域的聲明,類型是pNode,要知道pNode表示的是類型的新名字,那麼在類型本身還沒有建立完成的時候,這個類型的新名字也還不存在,也就是說這個時候編譯器根本不認識pNode。
解決這個問題的方法有多種:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在這個例子中,你用typedef給一個還未完全聲明的類型起新名字。C語言編譯器支持這種做法。
3)、規范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
3. typedef & #define的問題
有下面兩種定義pStr數據類型的方法,兩者有什麼不同?哪一種更好一點?
typedef char *pStr;
#define pStr char *;
答案與分析:
通常講,typedef要比#define要好,特別是在有指針的場合。請看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指針變數,根本原因就在於#define只是簡單的字元串替換而typedef則是為一個類型起新名字。
#define用法例子:
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \\n",c);
}
以下程序的輸出結果是: 36。
因為如此原因,在許多C語言編程規范中提到使用#define定義時,如果定義中包含表達式,必須使用括弧,則上述定義應該如下定義才對:
#define f(x) (x*x)
當然,如果你使用typedef就沒有這樣的問題。
4. typedef & #define的另一例
下面的代碼中編譯器會報一個錯誤,你知道是哪個語句錯了嗎?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案與分析:
是p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文本替換。上述代碼中const pStr p2並不等於const char * p2。const pStr p2和const long x本質上沒有區別,都是對變數進行只讀限制,只不過此處變數p2的數據類型是我們自己定義的而不是系統固有類型而已。因此,const pStr p2的含義是:限定數據類型為char *的變數p2為只讀,因此p2++錯誤。
#define與typedef引申談
1) #define宏定義有一個特別的長處:可以使用 #ifdef ,#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。
2) typedef也有一個特別的長處:它符合范圍規則,使用typedef定義的變數類型其作用范圍限制在所定義的函數或者文件內(取決於此變數定義的位置),而宏定義則沒有這種特性。
5. typedef & 復雜的變數聲明
在編程實踐中,尤其是看別人代碼的時候,常常會遇到比較復雜的變數聲明,使用typedef作簡化自有其價值,比如:
下面是三個變數的聲明,我想使用typdef分別給它們定義一個別名,請問該如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案與分析:
對復雜變數建立一個類型別名的方法很簡單,你只要在傳統的變數聲明表達式里用類型名替代變數名,然後把關鍵字typedef加在該語句的開頭就行了。
>1:int *(*a[5])(int, char*);
//pFun是我們建的一個類型別名
typedef int *(*pFun)(int, char*);
//使用定義的新類型來聲明對象,等價於int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先為上面表達式藍色部分聲明一個新類型
typedef void (*pFunParam)();
//整體聲明一個新類型
typedef void (*pFun)(pFunParam);
//使用定義的新類型來聲明對象,等價於void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先為上面表達式藍色部分聲明一個新類型
typedef double(*pFun)();
//整體聲明一個新類型
typedef pFun (*pFunParam)[9];
//使用定義的新類型來聲明對象,等價於doube(*)() (*pa)[9];
pFunParam pa;
[編輯本段]typedef的基礎問題
1. 基本解釋
typedef為C語言的關鍵字,作用是為一種數據類型定義一個新名字。這里的數據類型包括內部數據類型(int,char等)和自定義的數據類型(strUCt等)。
在編程中使用typedef目的一般有兩個,一個是給變數一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。
至於typedef有什麼微妙之處,請你接著看下面對幾個問題的具體闡述。
2. typedef &結構的問題
當用下面的代碼定義一個結構時,編譯器報了一個錯誤,為什麼呢?莫非C語言不允許在結構中包含指向它自己的指針嗎?請你先猜想一下,然後看下文說明:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
答案與分析:
1、typedef的最簡單使用
typedef long byte_4;
給已知數據類型long起個新名字,叫byte_4。
2、 typedef與結構結合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
這語句實際上完成兩個操作:
1) 定義一個新的結構類型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct稱為「tag」,即「標簽」,實際上是一個臨時名字,struct 關鍵字和tagMyStruct一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。
我們可以用struct tagMyStruct varName來定義變數,但要注意,使用tagMyStruct varName來定義變數是不對的,因為struct 和tagMyStruct合在一起才能表示一個結構類型。
2) typedef為這個新的結構起了一個名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct實際上相當於struct tagMyStruct,我們可以使用MyStruct varName來定義變數。
答案與分析
C語言當然允許在結構中包含指向它自己的指針,我們可以在建立鏈表等數據結構的實現上看到無數這樣的例子,上述代碼的根本問題在於typedef的應用。
根據我們上面的闡述可以知道:新結構建立的過程中遇到了pNext域的聲明,類型是pNode,要知道pNode表示的是類型的新名字,那麼在類型本身還沒有建立完成的時候,這個類型的新名字也還不存在,也就是說這個時候編譯器根本不認識pNode。
解決這個問題的方法有多種:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在這個例子中,你用typedef給一個還未完全聲明的類型起新名字。C語言編譯器支持這種做法。
3)、規范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
3. typedef & #define的問題
有下面兩種定義pStr數據類型的方法,兩者有什麼不同?哪一種更好一點?
typedef char *pStr;
#define pStr char *;
答案與分析:
通常講,typedef要比#define要好,特別是在有指針的場合。請看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指針變數,根本原因就在於#define只是簡單的字元串替換而typedef則是為一個類型起新名字。
#define用法例子:
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \n",c);
}
以下程序的輸出結果是: 36。
因為如此原因,在許多C語言編程規范中提到使用#define定義時,如果定義中包含表達式,必須使用括弧,則上述定義應該如下定義才對:
#define f(x) (x*x)
當然,如果你使用typedef就沒有這樣的問題。
4. typedef & #define的另一例
下面的代碼中編譯器會報一個錯誤,你知道是哪個語句錯了嗎?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案與分析:
是p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文本替換。上述代碼中const pStr p2並不等於const char * p2。const pStr p2和const long x本質上沒有區別,都是對變數進行只讀限制,只不過此處變數p2的數據類型是我們自己定義的而不是系統固有類型而已。因此,const pStr p2的含義是:限定數據類型為char *的變數p2為只讀,因此p2++錯誤。
(註:關於const的限定內容問題,在本系列第二篇有詳細講解)。
#define與typedef引申談
1) #define宏定義有一個特別的長處:可以使用 #ifdef ,#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。
2) typedef也有一個特別的長處:它符合范圍規則,使用typedef定義的變數類型其作用范圍限制在所定義的函數或者文件內(取決於此變數定義的位置),而宏定義則沒有這種特性。
5. typedef & 復雜的變數聲明
在編程實踐中,尤其是看別人代碼的時候,常常會遇到比較復雜的變數聲明,使用typedef作簡化自有其價值,比如:
下面是三個變數的聲明,我想使用typdef分別給它們定義一個別名,請問該如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案與分析:
對復雜變數建立一個類型別名的方法很簡單,你只要在傳統的變數聲明表達式里用類型名替代變數名,然後把關鍵字typedef加在該語句的開頭就行了。
>1:int *(*a[5])(int, char*);
//pFun是我們建的一個類型別名
typedef int *(*pFun)(int, char*);
//使用定義的新類型來聲明對象,等價於int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先為上面表達式藍色部分聲明一個新類型
typedef void (*pFunParam)();
//整體聲明一個新類型
typedef void (*pFun)(pFunParam);
//使用定義的新類型來聲明對象,等價於void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先為上面表達式藍色部分聲明一個新類型
typedef double(*pFun)();
//整體聲明一個新類型
typedef pFun (*pFunParam)[9];
//使用定義的新類型來聲明對象,等價於doube(*)() (*pa)[9];
⑼ C語言關於typedef結構體
#define
LED
((PIO_STR
*)
PIO_LED_BASE)
該宏定義自LED等同於PIO_STR類型的指針PIO_LED_BASE。括弧是用來保證宏定義在展開時不會發生錯誤。比如說,若PIO_LED_BASE是一個數組(#define
PIO_LED_BASE
((ULONG)pIo_Led_Base[MAX_BASE_SIZE])),使用
#define
LED
(PIO_STR
*
PIO_LED_BASE)
那麼展開時就會發生歧義。在宏定義中應該特別注意側邊效應!
⑽ c語言中typedef的作用范圍
使用typedef定義的變數類型其作用范圍限制在所定義的函數或者文件內。但是想在其他文件里也使用typedef定義的變數類型,常把typedef聲明單獨放一個文件里(導入頭文件),在用的時候用#include命令把這個文件導進來。
typedef的作用是,聲明新的類型名來代替原有的類型名。比如,typedef
int
INTERGER;
或
typedef
float
REAL;相當於用INTERGER來代表int類型,用REAL來代表float。
C語言中習慣上把用typedef聲明的類型用大寫字母表示。