2011-07-23 6 views
0

typedefは新しい型を作成できないため、この部分は "struct tnode"宣言の部分ですか?したがって、上記では、typedef "Treenode"を作成し、 "struct tnode"を宣言していますか?ここでK&R 2E Typedef pg 146,147

return (Treeptr) malloc(sizeof(Treenode)); 

、TREENODEは全体の「構造体TNODE」宣言と同義であるから、はsizeofに全体の宣言を渡す必要があるか、1だけで行うことができます。structを経由して他の場所TNODEを宣言した後はsizeof(構造体TNODE) tnode {...};

typedef struct tnode *Treeptr; 

typedefは次のとおりです。typedef old-existing-type newtype;だからここに.. struct tnode *はすでに存在していなければならない古い型です(別の場所で宣言しなければなりません)。そしてTreeptrはその同義語です。同様に:typedef struct tnode * Treeptr;

typedef int (*PFI)(char *, char *); 

ここでは何が起こっていますか?古い型はintで(* PFI)(char 、char)はintの同義語ですか? int(* PFI)(char *、char *)が古い型の場合、新しい型は何ですか? 「実際にtypedefは#defineのようなものですが、コンパイラによって解釈されるので、プリプロセッサの能力を超えたテキスト置換に対処できます」と言ってどういう意味ですか?上記の例では、なぜプリプロセッサは何が行われているのですか?

答えて

3

上記のように、typedef "Treenode"を作成し、 "struct tnode"と宣言していますか?

はい、同じ文に宣言と型定義があります。

しかし、なぜ私たちはスペースを置くことができないのですか?することができます - あなたが*について話している場合は、構造体のtypedef TNODE * Treeptr

:そうのように。それはとにかく別のトークンです。

typedef int (*PFI)(char *, char *); 

これは関数型の定義です。

#include <stdio.h> 

int add(int a, int b) { return a + b; } 

typedef int (*pfi)(int,int); 

int main() 
{ 
    pfi my_func = add; 
    int res; 
    res = (*my_func)(1,2); 
    printf("add(1,2)=%d", res); 
    return res; 
} 
+0

オブジェクト指向のおかげ:関数ポインタを使用するための

コードサンプル:

typedef int (*PFI)(char *, char *); ^ define a type called ^PFI as: ^pointer ^to function ^that receives two char pointers as arguments ^and returns an int 

今、あなたは(パラメータ/変数として使用する場合)の代わりにint (*)(char *, char *)

EDITをPFIを使用することができます! typedef int(* PFI)(char *、char *)は自動的にPFI #defineを作成し、PFI foo barを実行すると#define(マクロ)のように変換されますto:int(* PFI)(foo、bar) –

+0

いいえ、タイプ定義として定義しました...申し訳ありませんが、明確ではないため、修正します。 – MByD

+0

@MByD小さなコードでPFIを使用する方法を説明できますか? – Dubby