2016-12-28 33 views
1

私は以下のコードを解析しています。typedef構造体と構造体については実際には分かりません。Cの関数のtypedef構造体と構造体の相違

typedef struct 
{ 
    float width, height, start; 
    unsigned int *pixmap; 
}arguments; 

しかし、私は同じプログラム内の関数を見たとき、私はこれを見ることができます:グローバル次のコードで がある

struct arguments{ 
    float start; 
    float width; 
    float height; 
    unsigned int *pixmap; 
    }; 

私の質問があり、それはnecassaryこのstruct argumentsを追加することです私はすでにグローバルでそれを宣言して以来、関数で?

+1

メンバーの順序が異なることに気付いている限り、おそらくそれらのいずれかを使用できます。 – Gerhardh

+2

"同じプログラム内の関数を見ると"。それはどういう意味ですか?私は、 '構造体'が関数内で定義されていないことを推測しています(それはあなたが意味するものではないと推測しています)。おそらく、それを使用する関数と同じファイル内にあることを意味します。そうであれば、答えは「それに依存する」です。これは 'typedef'がどこで定義されているか、関数がそれを見ることができるかどうかによって決まります。私たちはあなたの完全なコードのコンテキストを持っておらず、そうであるかどうかを伝えることはできません。 – kaylum

答えて

3

必ずしもそうではありません。構造体はグローバルスコープで宣言されているので、引き続き使用できます。 typedef structstructの違いを覚えておいてください。hereで読むことができ、グローバル構造体のメンバの順序が関数構造体のメンバの順序と異なっていることもわかります。

+0

ありがとう!違いを十分に理解できるようにします! – HaniMasta

+1

@HaniMastaメンバーの順番は非常に重要です。 –

+0

構造タグの有無も非常に重要です。 –

1

宣言が標準で「互換型」でないデータ型は、その用語を定義するため、互換性のある形で使用することはできません。構造体型が互換性を持つためには、同じ順序で同じメンバ名と型だけでなく、同じタグも持つ必要があります。最後のポイントは2つの違いです。特に

、あなたtypedefは、指定されたメンバーとタグなし構造型の別名として識別子argumentsを定義します。その識別子がスコープ内にある場合は、その識別子をタイプ名として使用できます。実際、それが参照する構造体型にはタグがないため、その型を参照する他の方法はありません。

他の宣言では、構造タイプがタグargumentsと宣言されています。その宣言がスコープ内にある場合は、あなたがstruct argumentsとしてその型を参照することはできませんが、同じくらいarguments(C++は、この点に異なります):

struct arguments my_arguments; 

my_arguments.width = 5; 
// ... 

私の質問は、それがnecassaryこの構造体の引数を追加することです私はすでにグローバルでそれを宣言して以来、関数で?

Cにはグローバルな宣言はありません。これにはファイルスコープ宣言があり、デフォルトでは外部リンクを持つ関数とオブジェクトが宣言されています。つまり、プログラム内のどこからでもアクセスできます。それはまったく同じことではありません。したがって、どちらの型を使用する場合でも、その宣言は有効範囲内になければなりません。通常、このような要件を満たすために、ヘッダファイルに共有宣言を挿入します。いずれにしても、これらのタイプの宣言は、他のタイプの宣言としては機能しません。

ただし、いずれかの宣言で...

typedef struct arguments // <--- note the tag here 
{ 
    float width, height, start; 
    unsigned int *pixmap; 
} arguments; 

...または2 ...

struct arguments 
{ 
    float width, height, start; 
    unsigned int *pixmap; 
}; 

typedef struct arguments arguments; 

のいずれかで、typedefed構造をタグ付けすることにより、それらは互換することを検討可能性があり代わりにargumentsstruct argumentsの別名になります。

+0

今は何を使うべきかは分かりません。私はあなたの時間に感謝します。 – HaniMasta