質問: 警告:「struct user_data_s」がパラメータリスト内で宣言されています このエラーが発生します:transform.c:23: warning: ‘struct user_data_s’ declared inside parameter list transform.c:23: warning: its scope is only this definition or declaration, which is probably not what you want これは、構造体を含む構造体があるためです。これは私がやろうとしていることです:void f2(struct user_data_s* data) { printf("number %i\n", data->l); } void f1(struct user_data_s* data) { printf("number %i\n", data->l); f2(data); } f1のprintfは機能しますが、次の行void f2(struct user_data_s* data) { エラーを出します。誰か私がこれを修正する方法を知っていますか?
回答: コンパイラーはすでに何が起こっているかについてかなり良い説明をしてくれました。struct user_data_sを事前にどこにも宣言していません。コンパイラーは、上記の関数定義でstruct user_data_sを初めて認識します。どちらの場合も、struct user_data_sの宣言にはブロックスコープがあります。つまり、対応する関数に対してローカルです。つまり、struct user_data_s定義のf1の最初の宣言は、struct user_data_s定義のf2の2番目の宣言とはまったく関係ありません。これらの宣言は、2つの完全に異なる(各関数に対して)ローカル型struct user_data_sを宣言します。例のようにf2からf1を呼び出すことはできません。これらのパラメータタイプはまったく関係がないためです。通常、関数定義で宣言するのではなく、事前にファイルスコープでstruct user_data_sを宣言しておく必要があります。たまたま、struct user_data_sの宣言にヘッダーを含めるのを忘れていませんか?