предупреждение: «struct user_data_s» объявлена ​​внутри списка параметров - PullRequest
14 голосов
/ 12 ноября 2009

Я получаю эту ошибку:

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

printf в f1 работает, но строка

void f2(struct user_data_s* data) {

выдает ошибку.

Кто-нибудь знает, как я могу это исправить?

Ответы [ 2 ]

23 голосов
/ 12 ноября 2009

Вы объявили свою структуру между (или, возможно, после) объявлениями f2 и f1. Переместите объявление структуры так, чтобы оно предшествовало обоим объявлениям.

То есть:

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

не скомпилируется, потому что f2 не может узнать, что такое struct user_data_s.

Возможно, вы привыкли к программированию на языке более высокого уровня, который позволяет размещать ваши объявления / определения практически везде (например, C # или Python), но, к сожалению, C компилируется строго сверху вниз.

6 голосов
/ 12 ноября 2009

Компилятор уже дал вам довольно хорошее объяснение того, что происходит.

Вы нигде не объявили struct user_data_s заранее. Компилятор видит struct user_data_s в приведенных выше определениях функций впервые. В каждом случае объявление struct user_data_s имеет область видимости блока, то есть оно локально для соответствующей функции. Это означает, что первое объявление struct user_data_s в определении f1 полностью не связано со вторым объявлением struct user_data_s в определении f2. Эти объявления объявляют два совершенно разных локальных (для каждой функции) типа struct user_data_s. Вы не можете вызвать f2 из f1, как в вашем примере, так как их типы параметров совершенно не связаны.

Обычно вы должны заранее объявить struct user_data_s в области видимости файла, а не объявлять его в определении функции. Вы случайно не включили заголовок с объявлением struct user_data_s?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...