宣言が標準で「互換型」でないデータ型は、その用語を定義するため、互換性のある形で使用することはできません。構造体型が互換性を持つためには、同じ順序で同じメンバ名と型だけでなく、同じタグも持つ必要があります。最後のポイントは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構造をタグ付けすることにより、それらは互換することを検討可能性があり代わりにarguments
はstruct arguments
の別名になります。
メンバーの順序が異なることに気付いている限り、おそらくそれらのいずれかを使用できます。 – Gerhardh
"同じプログラム内の関数を見ると"。それはどういう意味ですか?私は、 '構造体'が関数内で定義されていないことを推測しています(それはあなたが意味するものではないと推測しています)。おそらく、それを使用する関数と同じファイル内にあることを意味します。そうであれば、答えは「それに依存する」です。これは 'typedef'がどこで定義されているか、関数がそれを見ることができるかどうかによって決まります。私たちはあなたの完全なコードのコンテキストを持っておらず、そうであるかどうかを伝えることはできません。 – kaylum