音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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)
關(guān)于c語(yǔ)言用typedef定義一個(gè)新類型名的一個(gè)問(wèn)題
我雖然知道“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
另,祝各位熱心大俠新年萬(wàn)事如意!
 
3樓: >>參與討論
iamatyro
怎么沒(méi)有人看呀!
自己頂

4樓: >>參與討論
zhaoyk1981
幫你頂一下!
我也不懂呀!

5樓: >>參與討論
lqnjerry
看看
意思是不是用AItem代替(Byte ucItemID)
用BItem代替(Byte ucItemID, Byte ucVal)

6樓: >>參與討論
小易
呵呵,這是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
呵呵
typedef的語(yǔ)法和#define的不一樣,
如果把它倆當(dāng)一個(gè)了,那就不好了

在有typedef的地方,只要把它去掉,然后看看定義的是什么“變量”,
并且看看它是什么類型的。如果是函數(shù)就把它當(dāng)函數(shù)的聲明好了。

然后就可以用這個(gè)“變量”去定義相同的類型了。哈。

如:
typedef int (*A)[];
然后
A a;
就與
int (*a)[];
等價(jià)了。

8樓: >>參與討論
iamatyro
樓上兩位大蝦隨說(shuō)得有道理,但
樓上兩位大蝦隨說(shuō)得有道理,但和“typedef 老類型名  新類型名;”是指定用“新類型名”代表“老類型名”的定義是否不一致?還望指教!

9樓: >>參與討論
enruan
。
“typedef 老類型名  新類型名;”
這不對(duì)。
》typedef的語(yǔ)法和#define的不一樣,
》如果把它倆當(dāng)一個(gè)了,那就不好了

他不是簡(jiǎn)單的替換,他的語(yǔ)法跟變量聲明的一樣。



10樓: >>參與討論
iamatyro
我還是糊涂哇!
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
這樣看就清晰一點(diǎn)了
typedef Void(Byte ucItemID) (* Code AItem);
typedef Void(Byte ucItemID, Byte ucVal) (* Code BItem);

這樣看就清晰一點(diǎn)了,不過(guò)這樣在c語(yǔ)言里行不通,呵呵.


12樓: >>參與討論
ilovu
我的理解
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
信我的沒(méi)錯(cuò),他寫錯(cuò)了
 
14樓: >>參與討論
enruan

把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
謝謝enruan!
讓我琢磨琢磨......

16樓: >>參與討論
gaoqianzhe
寫個(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
還想問(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è)泡飯



19樓: >>參與討論
enruan
我說(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
呵呵,我還糊涂哇
我說(shuō)enruan兄弟,上述虛線內(nèi)的描述可是清華大學(xué)王立柱教授編寫的新近二版《C/C++及數(shù)據(jù)結(jié)構(gòu)》一書(shū)中對(duì)typedef 的描述,你說(shuō)其有錯(cuò),應(yīng)該不至于吧!

21樓: >>參與討論
enruan
學(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
?
enruan,你前面說(shuō)過(guò)“#define 是宏替換,主要就是字符替換,是由預(yù)處理器進(jìn)行的,而typedef 是類型替換,是由編譯器進(jìn)行的”
那typedef 和C++的同樣也是由編譯器進(jìn)行的內(nèi)聯(lián)函數(shù)孰優(yōu)孰劣?


23樓: >>參與討論
enruan
你是不是生氣了?
不好意思,我這人說(shuō)話可能有點(diǎn)兒直。

typedef 是定義類型的吧,所以不管是否內(nèi)聯(lián),它都不會(huì)和函數(shù)實(shí)現(xiàn)相同的功能吧?
#define 是字符替換的,也包括了指令,你是在說(shuō)它和內(nèi)聯(lián)函數(shù)的關(guān)系吧?


24樓: >>參與討論
jacksting
有一本《c專家編程》
好像是一個(gè)叫做徐波的翻譯的。里面講typedef很清楚。

25樓: >>參與討論
iamatyro
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
請(qǐng)參照K&R的《The C PROGRAMMING Language》(second edition)
typedef有兩種用法,一種和define一樣,另外一種就是大伙討論的晦澀難懂的那種。

27樓: >>參與討論
shengm
我也來(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
同義詞和替換
當(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
真的很熱鬧!
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é):
。。。

*/

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
uclinux運(yùn)行至少需要多少ram??
只要有一個(gè)高手回答,我就心滿意足了
DSP(DM642)視頻采集(SAA7114)問(wèn)題求助:
求救:AM186的A0腳是空的
ucos v2.52的下載地址
免費(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)