2016-11-11 2 views
4
#include <stdio.h> 
#include <string.h> 

typedef struct Books { 
    char title[50]; 
    char author[50]; 
    char subject[100]; 
    int book_id; 
} Book; 

int main() { 

    Book book; 

    strcpy(book.title, "C Programming"); 
    strcpy(book.author, "Nuha Ali"); 
    strcpy(book.subject, "C Programming Tutorial"); 
    book.book_id = 6495407; 

    printf("Book title : %s\n", book.title); 
    printf("Book author : %s\n", book.author); 
    printf("Book subject : %s\n", book.subject); 
    printf("Book book_id : %d\n", book.book_id); 

    return 0; 
} 

この例では、ブックは新しいデータ型か、構造の代替名ですか?typedefをC言語で使用すると、新しい型または型名のみが作成されますか?

または他の言葉でコードがある場合:typedef unsigned char newDType; newDTypeunsigned charに新しいデータ型または代替名ですか?

+0

興味があるだけで公開されカーニハンとリッチー(K & R1)の初版に戻って...どのような違いそれはあなた(または誰)に作るのですか? –

+3

@EugeneSh .:それは大きな違いを生むことができます。たとえば、 'typedef int my_int;'が別の型を作成した場合、 'int *'と 'my_int *'は互換性がなく、キャストなしでもう一方に割り当てることができませんでした。代わりに、それらは同じタイプです。 –

答えて

1

typedef specifier msdn pageクリック詳細を知るために)

からtypedef宣言は、その範囲内に、宣言の型宣言部によって指定されたタイプの同義語となり、名前を導入します。


引用されたように、新しい名前は元の型のためだけの代替名同義語)です。一般に、宣言をより均一かつコンパクトにするために、宣言が使用されます(typedef)。

2

typedefは、比較プログラミング言語を話している場合、新しい型を作成しません。これは、型のエイリアスを効果的に作成します。

3

いいえ、typedefは、型のエイリアスを作成し、どちらかを使用すると効果的に同等になります。

cppreferenceを引用:

typedef宣言はおそらく複合型名
を置き換えるために使用される、型別名として識別子を宣言するための方法を提供する[...]
typedef宣言はありません特殊タイプを導入しないで、既存のタイプの同義語のみを設定する。

そして、必須が起こることがあります。そうでなければ、インターフェイスでよく使われている不透明なタイプが不可能になるからです。

+0

私はあなたの最後の文を理解していないし、残りの議論からどのように続くのか理解していない。 – Vality

+0

@Vality: 'FILE'を考えてください。' FILE'は内部の 'struct'の' typedef'です。 [時々](http://stackoverflow.com/posts/comments/68336110?noredirect=1)それは他の宣言と一致することが重要です。異なるタイプを作成した場合、これは不可能です。それは役に立ちますか? – edmz

+1

ああ、そうですねちょっと意味があります。私は今あなたが何を意味するかを見ます。 (それは例外的に良い例であるので、あなたの答えに入れてもよいでしょう)。 +1 – Vality

6

これに対する決定的な答えは、ISO C標準にあります。 N1570は最新のドラフトです。 6.7.8項3氏は述べています:

typedef宣言は新しいタイプなので、指定されたタイプのためだけ 同義語を導入しません。

同様の文言は、Cの標準の以前のすべてのエディションで表示され、少なくとも1978年

関連する問題