2009-11-12 9 views
11

警告: '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) { 

はエラーを示します。

私はこれをどのように修正できるか知っていますか?

ハグ、 Louise

+3

'struct user_data_s'の宣言、後でhugsを含む完全なコードを表示してください。 –

+0

[Strange compiler warning C:warning: 'struct'がパラメータリスト内で宣言されています](http://stackoverflow.com/questions/) 16831605/strange-compiler-warning-c-warning-struct-declared-inside-parameter-list) –

答えて

20

あなたは(または多分後)の間にf2f1のあなたの宣言を自分の構造体を宣言しました。両方の宣言の前に来るように構造体宣言を移動します。

struct user_data_s 
{ 
    int L; 
}; 

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); 
} 

は、エラーなしでコンパイルが、f2struct user_data_sが何であるかを知る方法はありませんので、

void f2(struct user_data_s* data) { 
     printf("Number %i\n", data->L); 
} 


struct user_data_s 
{ 
    int L; 
}; 

void f1(struct user_data_s* data) { 
     printf("Number %i\n", data->L); 
     f2(data); 
} 

は、コンパイルされません。と言うことです

宣言/定義をどこでも(C#やPythonなど)どこにでも置くことができるように、より高度な言語でプログラミングすることができますが、残念ながらCは厳密にトップからボトムにコンパイルされます。

+0

非常にありがとう=)構造体が定義されているヘッダファイルには含まれていませんでした。私は自分のことを決して考えなかったでしょう。 – Louise

+0

また別の一般的な、まだ見つけることが難しい、これが発生する理由があります。その構造体定義、またはその依存関係の1つを持つヘッダファイルにはエラーがあります。放棄は通常警告リストの一番下にあるので、うまくいくのは難しいでしょう。 –

5

コンパイラは、何が起こっているかについてかなり良い説明をしてくれました。

struct user_data_sを先に宣言していません。コンパイラは上記の関数定義の中で初めてstruct user_data_sを見ています。いずれの場合も、struct user_data_sの宣言にはブロックスコープがあります。つまり、対応する関数のローカルです。これは、f1定義のstruct user_data_sの最初の宣言がf2定義のstruct user_data_sの2番目の宣言と完全に無関係であることを意味します。これらの宣言は、2つの完全に異なるローカル(各関数に)タイプstruct user_data_sを宣言します。あなたの例ではf2f1から呼び出すことはできません。なぜならそれらのパラメータタイプは完全に無関係であるからです。

通常、関数定義で宣言するのではなく、ファイルスコープで事前にstruct user_data_sを宣言しておく必要があります。万が一、struct user_data_sという宣言を含むヘッダーを含めることを忘れましたか?

+0

はい=)それはまさに問題でした。ヘッダーファイルを含めるのを忘れた=)深い説明をありがとうございます。今私は決して再びそのミスをしないだろう=) – Louise

関連する問題