|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關(guān)于c語(yǔ)言用typedef定義一個(gè)新類型名的一個(gè)問(wèn)題 |
| 作者:iamatyro 欄目:嵌入式系統(tǒng) |
我雖然知道“typedef 老類型名 新類型名;”是指定用“新類型名”代表“老類型名”,但對(duì)于下面的兩個(gè)指定我就有些迷糊了: typedef Void (* Code AItem)(Byte ucItemID); typedef Void (* Code BItem)(Byte ucItemID, Byte ucVal); 難道是用“(* Code AItem)(Byte ucItemID)”代表“Void”? 和用“(* Code BItem)(Byte ucItemID, Byte ucVal)”代表“Void”? 這有什么意義呢?我覺(jué)得沒(méi)有意義。 我知道(* Code AItem)(Byte ucItemID)和(* Code BItem)(Byte ucItemID, Byte ucVal)都是定義了一個(gè)指向函數(shù)的指針。 還請(qǐng)大俠指點(diǎn)! * - 本貼最后修改時(shí)間:2005-1-1 21:45:45 修改者:iamatyro |
| 2樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/1 17:42:00 發(fā)布:
另,祝各位熱心大俠新年萬(wàn)事如意! |
|
| 3樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/2 22:34:00 發(fā)布:
怎么沒(méi)有人看呀! 自己頂 |
|
| 4樓: | >>參與討論 |
| 作者: zhaoyk1981 于 2005/1/3 16:28:00 發(fā)布:
幫你頂一下! 我也不懂呀! |
|
| 5樓: | >>參與討論 |
| 作者: lqnjerry 于 2005/1/3 16:48:00 發(fā)布:
看看 意思是不是用AItem代替(Byte ucItemID) 用BItem代替(Byte ucItemID, Byte ucVal) |
|
| 6樓: | >>參與討論 |
| 作者: 小易 于 2005/1/4 13:43:00 發(fā)布:
呵呵,這是C語(yǔ)言里的復(fù)雜變量類型定義 typedef Void (* Code AItem)(Byte ucItemID); 是定義了一個(gè)指向一個(gè)Byte類型的參數(shù)無(wú)返回的函數(shù)指針; typedef Void (* Code BItem)(Byte ucItemID, Byte ucVal); 是定義了一個(gè)指向具有兩個(gè)Byte 參數(shù)的無(wú)返回函數(shù)指針。 * - 本貼最后修改時(shí)間:2005-1-4 13:46:12 修改者:小易 |
|
| 7樓: | >>參與討論 |
| 作者: enruan 于 2005/1/4 15:23:00 發(fā)布:
呵呵 typedef的語(yǔ)法和#define的不一樣, 如果把它倆當(dāng)一個(gè)了,那就不好了 在有typedef的地方,只要把它去掉,然后看看定義的是什么“變量”, 并且看看它是什么類型的。如果是函數(shù)就把它當(dāng)函數(shù)的聲明好了。 然后就可以用這個(gè)“變量”去定義相同的類型了。哈。 如: typedef int (*A)[]; 然后 A a; 就與 int (*a)[]; 等價(jià)了。 |
|
| 8樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/4 22:19:00 發(fā)布:
樓上兩位大蝦隨說(shuō)得有道理,但 樓上兩位大蝦隨說(shuō)得有道理,但和“typedef 老類型名 新類型名;”是指定用“新類型名”代表“老類型名”的定義是否不一致?還望指教! |
|
| 9樓: | >>參與討論 |
| 作者: enruan 于 2005/1/5 12:32:00 發(fā)布:
。 “typedef 老類型名 新類型名;” 這不對(duì)。 》typedef的語(yǔ)法和#define的不一樣, 》如果把它倆當(dāng)一個(gè)了,那就不好了 他不是簡(jiǎn)單的替換,他的語(yǔ)法跟變量聲明的一樣。 |
|
| 10樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/5 22:02:00 發(fā)布:
我還是糊涂哇! enruan兄弟,你說(shuō):“typedef不是簡(jiǎn)單的替換,他的語(yǔ)法跟變量聲明的一樣!边@就把我給說(shuō)糊涂了,請(qǐng)你看下面這一段關(guān)于類型名選擇typedef的描述: --------------------------------------------------------------------- 既然可以根據(jù)需要定義數(shù)據(jù)類型,那么能否根據(jù)愛(ài)好選擇類型名呢?比如用INTEGER定義整型變量,用REAL定義實(shí)型變量。C語(yǔ)言滿足這種要求:通過(guò)類型名選擇定義,可以為已有的類型選擇一個(gè)別名,其定義的格式為: typedef 已有的類型名 新的類型名; 例如: typedef int INTEGER; typedef float REAL; 指定用INTEGER代表int,用REAL代表float。定義后, INTEGER i,j;等價(jià)于 int i,j; REAL a,b; 等價(jià)于 float a,b; 學(xué)習(xí)過(guò)Pascal語(yǔ)言的人,習(xí)慣用INTEGER和REAL,使用這個(gè)方法在學(xué)習(xí)C語(yǔ)言編程時(shí),還可以保留自己的習(xí)慣。 --------------------------------------------------------------------- 希望各位大蝦討論賜教! |
|
| 11樓: | >>參與討論 |
| 作者: csword 于 2005/1/6 9:48:00 發(fā)布:
這樣看就清晰一點(diǎn)了 typedef Void(Byte ucItemID) (* Code AItem); typedef Void(Byte ucItemID, Byte ucVal) (* Code BItem); 這樣看就清晰一點(diǎn)了,不過(guò)這樣在c語(yǔ)言里行不通,呵呵. |
|
| 12樓: | >>參與討論 |
| 作者: ilovu 于 2005/1/6 10:13:00 發(fā)布:
我的理解 typedef Void (* Code AItem)(Byte ucItemID); 表示定義一種函數(shù)指針類型,類型名為Code AItem,指向帶一個(gè)Byte型參數(shù)無(wú)返回值的函數(shù)。聲明新的這種類型的指針可以這樣: Code AItem pfbvItem; typedef Void (* Code BItem)(Byte ucItemID, Byte ucVal); 有兩個(gè)Byte類型的參數(shù) |
|
| 13樓: | >>參與討論 |
| 作者: enruan 于 2005/1/6 13:41:00 發(fā)布:
信我的沒(méi)錯(cuò),他寫錯(cuò)了 |
|
| 14樓: | >>參與討論 |
| 作者: enruan 于 2005/1/6 14:07:00 發(fā)布:
。 把typedef去掉,然后把要定義的類型名假設(shè)成變量名, 這個(gè)假設(shè)的變量名什么類型,用他去定義的變量就是什么類型。 如: typedef int (*DEMO[])(int,float); DEMO p; 那么p就可以這么用: (*p[index])(int,float); 這里 *p[index] 相當(dāng)于函數(shù)名兒,而且這種函數(shù)的參數(shù)調(diào)用必須是 (int,float) 所以 p[index] 就是函數(shù)指針,而且這種函數(shù)的參數(shù)調(diào)用必須是 (int,float) 所以 p 就是函數(shù)指針數(shù)組,而且這種函數(shù)的參數(shù)調(diào)用必須是 (int,float) C編譯器實(shí)際上也是這么翻譯的 #define 是宏替換,主要就是字符替換,是由預(yù)處理器進(jìn)行的 而typedef 是類型替換,是由編譯器進(jìn)行的 如: int *a[]; int *b[]; 編譯器經(jīng)過(guò)了兩次的詞法分析和語(yǔ)法分析, 每一次的過(guò)程都一樣。 而: typedef int *IPinterArray[]; IPinterArray a,b; 則只要一遍就可以了,就是typedef時(shí)分析的, 然后用他定義的就跟他一樣了。 如: IPinterArray x; /* x的類型和IPinterArray一樣 */ IPinterArray *y; /* *y的類型和IPinterArray一樣 */ 希望您這回懂了。 * - 本貼最后修改時(shí)間:2005-1-24 14:32:11 修改者:enruan |
|
| 15樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/6 22:43:00 發(fā)布:
謝謝enruan! 讓我琢磨琢磨...... |
|
| 16樓: | >>參與討論 |
| 作者: gaoqianzhe 于 2005/1/7 17:31:00 發(fā)布:
寫個(gè)小程序測(cè)試一下不就明白了 #include "stdio.h" typedef void (*a)(int i); void fun( int i ) { printf(" i=%d",i ); } void main() { a f; f = fun; f(5); } |
|
| 17樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/9 10:55:00 發(fā)布:
還想問(wèn)問(wèn)...... enruan 發(fā)表于 2005-1-6 13:41 嵌入式系統(tǒng) ←返回版面 信我的沒(méi)錯(cuò),他寫錯(cuò)了 ------------------------------------------------------ enruan兄弟,非常感謝你的熱心指點(diǎn)!我仔細(xì)琢磨了你的兩次解釋,感覺(jué)基本上通了。不過(guò)上面虛線上的你所說(shuō)的“他寫錯(cuò)了”,是指“ilovu 發(fā)表于 2005-1-6 10:13”所說(shuō)的?如果是,我也認(rèn)為他說(shuō)的不對(duì)。但如果你是指我“發(fā)表于 2005-1-5 22:02 我還是糊涂哇!”中的一段關(guān)于類型名選擇typedef的描述,那我就又糊涂了,請(qǐng)明示! * - 本貼最后修改時(shí)間:2005-1-9 10:58:48 修改者:iamatyro |
|
| 18樓: | >>參與討論 |
| 作者: 可樂(lè)泡飯 于 2005/1/9 16:37:00 發(fā)布:
哦 哦 |
|
| 19樓: | >>參與討論 |
| 作者: enruan 于 2005/1/9 18:12:00 發(fā)布:
我說(shuō)的是這個(gè) --------------------------------------------------------------------- 既然可以根據(jù)需要定義數(shù)據(jù)類型,那么能否根據(jù)愛(ài)好選擇類型名呢?比如用INTEGER定義整型變量,用REAL定義實(shí)型變量。C語(yǔ)言滿足這種要求:通過(guò)類型名選擇定義,可以為已有的類型選擇一個(gè)別名,其定義的格式為: typedef 已有的類型名 新的類型名; 例如: typedef int INTEGER; typedef float REAL; 指定用INTEGER代表int,用REAL代表float。定義后, INTEGER i,j;等價(jià)于 int i,j; REAL a,b; 等價(jià)于 float a,b; 學(xué)習(xí)過(guò)Pascal語(yǔ)言的人,習(xí)慣用INTEGER和REAL,使用這個(gè)方法在學(xué)習(xí)C語(yǔ)言編程時(shí),還可以保留自己的習(xí)慣。 --------------------------------------------------------------------- |
|
| 20樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/9 22:23:00 發(fā)布:
呵呵,我還糊涂哇 我說(shuō)enruan兄弟,上述虛線內(nèi)的描述可是清華大學(xué)王立柱教授編寫的新近二版《C/C++及數(shù)據(jù)結(jié)構(gòu)》一書(shū)中對(duì)typedef 的描述,你說(shuō)其有錯(cuò),應(yīng)該不至于吧! |
|
| 21樓: | >>參與討論 |
| 作者: enruan 于 2005/1/15 12:13:00 發(fā)布:
學(xué)習(xí)緊,好久沒(méi)來(lái)了 呵呵, 咱怎么地也算是成人了 不要輕易相信任何人的 (當(dāng)然也包括我) 實(shí)踐是標(biāo)準(zhǔn), 你可以自己測(cè)試一下, 要是你有工夫的話也可以看一下源碼。 不要以為教授就不犯錯(cuò)誤, 他學(xué)C語(yǔ)言的時(shí)間不一定比你的長(zhǎng)。 哈哈,我基本上認(rèn)為中國(guó)的老師大都不如學(xué)習(xí),括弧外國(guó)的沒(méi)見(jiàn)過(guò) 因?yàn)槲野l(fā)現(xiàn)在很少有老師會(huì)謙虛在聽(tīng)學(xué)生講的, 而學(xué)生都能。 學(xué)生在學(xué),而教師不在學(xué)...呵呵呵 估計(jì)他們當(dāng)年也是這么過(guò)來(lái)的。 |
|
| 22樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/18 22:00:00 發(fā)布:
? enruan,你前面說(shuō)過(guò)“#define 是宏替換,主要就是字符替換,是由預(yù)處理器進(jìn)行的,而typedef 是類型替換,是由編譯器進(jìn)行的” 那typedef 和C++的同樣也是由編譯器進(jìn)行的內(nèi)聯(lián)函數(shù)孰優(yōu)孰劣? |
|
| 23樓: | >>參與討論 |
| 作者: enruan 于 2005/1/19 18:35:00 發(fā)布:
你是不是生氣了? 不好意思,我這人說(shuō)話可能有點(diǎn)兒直。 typedef 是定義類型的吧,所以不管是否內(nèi)聯(lián),它都不會(huì)和函數(shù)實(shí)現(xiàn)相同的功能吧? #define 是字符替換的,也包括了指令,你是在說(shuō)它和內(nèi)聯(lián)函數(shù)的關(guān)系吧? |
|
| 24樓: | >>參與討論 |
| 作者: jacksting 于 2005/1/19 19:50:00 發(fā)布:
有一本《c專家編程》 好像是一個(gè)叫做徐波的翻譯的。里面講typedef很清楚。 |
|
| 25樓: | >>參與討論 |
| 作者: iamatyro 于 2005/1/19 23:19:00 發(fā)布:
to enruan 你誤解了,我沒(méi)有生氣,應(yīng)該要謝謝你給予我的指點(diǎn)!至少使我對(duì)typedef有了更深的認(rèn)識(shí)。不過(guò)你否定王立柱教授教材中對(duì)typedef的定義,我感到還是有些不明白,至少我參考了幾本不同教材對(duì)typedef的定義基本都是一致的,我承認(rèn)我們的有些大學(xué)教授未必能跟上發(fā)展,寫的東西往往都已落后時(shí)代了,但我買的清華大學(xué)王立柱教授這本書(shū)我覺(jué)得是我近幾年見(jiàn)到的最好的C教材了,使我對(duì)C的學(xué)習(xí)有了進(jìn)一步提高,特別是這本書(shū)附帶的光碟非常好,碟中給出的例子用圖文一步步展示出來(lái),使學(xué)習(xí)者很容易理解比較晦澀難懂的數(shù)據(jù)結(jié)構(gòu)。呵呵,我對(duì)C還是比較菜,希望你多發(fā)言! to jacksting:如果方便,能否把這本書(shū)對(duì)typedef的解釋貼出來(lái),讓大家多角度理解理解! |
|
| 26樓: | >>參與討論 |
| 作者: wwcx 于 2005/1/21 22:59:00 發(fā)布:
請(qǐng)參照K&R的《The C PROGRAMMING Language》(second edition) typedef有兩種用法,一種和define一樣,另外一種就是大伙討論的晦澀難懂的那種。 |
|
| 27樓: | >>參與討論 |
| 作者: shengm 于 2005/1/21 23:24:00 發(fā)布:
我也來(lái)湊熱鬧 enruan說(shuō)的基本沒(méi)錯(cuò)! 我也是他那樣理解的! 先用 typedef Void (* Code AItem)(Byte ucItemID); 然后 AItem a; 就相當(dāng)于 typedef Void (* Code a)(Byte ucItemID); 書(shū)是死的,人是活的。 |
|
| 28樓: | >>參與討論 |
| 作者: ferry 于 2005/1/22 13:15:00 發(fā)布:
同義詞和替換 當(dāng)一個(gè)聲明的存儲(chǔ)類別是typedef時(shí)(其他存儲(chǔ)類別有:auto,static,extern register),編譯器就啟動(dòng)類型定義機(jī)制,給同一類型增加一個(gè)同義詞。 typedef 老類型名 新類型名,F(xiàn)在老類型名和新類型名都指同一個(gè)類型。 define聲明則是在預(yù)處理階段進(jìn)行的變量名替換,舊的變量名被新的替換掉了。 |
|
| 29樓: | >>參與討論 |
| 作者: exdata 于 2005/1/22 23:04:00 發(fā)布:
真的很熱鬧! enruan說(shuō)的不錯(cuò),寫幾個(gè)例子比較一下,希望對(duì)理解有幫助。 /* 首先看這樣的處理方法: #define PINT32 int* int _tmain(int argc, _TCHAR* argv[]) { PINT32 p1; // 定義一個(gè)int*指針p1,ok PINT32 p2; // 定義一個(gè)int*指針p2,ok PINT32 p3, p4; // 原本意圖定義int*指針p3、p4,但是這樣寫的結(jié)果p4不是指針 p3 = 12345678; // 編譯錯(cuò)誤,一般編譯器不允許將一個(gè)數(shù)直接賦值一個(gè)指針,除非手工強(qiáng)制裝換 p4 = 12345678; // 不會(huì)編譯報(bào)錯(cuò) return 0; } 原因: PINT32 p3, p4;編譯預(yù)處理結(jié)果為:int* p3, p4;執(zhí)行編譯時(shí)等效:int* p3;int p4; //////////////////////////////////////////////////////////////////////////////////////////////// 現(xiàn)在再看這樣的處理方法: typedef signed int* PINT32; int _tmain(int argc, _TCHAR* argv[]) { PINT32 p1; // 定義一個(gè)int*指針p1,ok PINT32 p2; // 定義一個(gè)int*指針p2,ok PINT32 p3, p4; // 現(xiàn)在p3、p4都是指針,ok p3 = NULL; // p4 = 12345678; // 編譯錯(cuò)誤,一般編譯器不允許將一個(gè)數(shù)直接賦值一個(gè)指針,除非手工強(qiáng)制裝換 return 0; } 原因: PINT32 p3, p4;在編譯階段分解為signed int* p3;signed int* p4;所以。。。 //////////////////////////////////////////////////////////////////////////////////////////////// 最后看一個(gè)更加特殊的例子: #define PVOID void* int _tmain(int argc, _TCHAR* argv[]) { PVOID p1,p2; // 這樣的定義在編譯階段都沒(méi)發(fā)通過(guò),因?yàn)椴荒荛L(zhǎng)生void p2變量! return 0; } 總結(jié): 。。。 */ |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |