it-swarm-ja.tech

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

エラーを出します。

誰か私がこれを修正する方法を知っていますか?

17
Louise

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

エラーなしでコンパイルしますが、

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

f2struct user_data_sが何であるかを知る方法がないため、コンパイルされません。

宣言/定義をほとんどどこにでも配置できる(C#やPythonなどの)高水準言語でのプログラミングに慣れているかもしれませんが、残念ながらCは厳密に上から下にコンパイルされます。

27
Mark Rushakoff

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

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の宣言にヘッダーを含めるのを忘れていませんか?

6
AnT