Warning: '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);
}

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

void f2(struct user_data_s* data) {

дает ошибку.

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

Ответ 1

Вы объявили свою структуру между (или, возможно, после) вашими объявлениями 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.

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

Ответ 2

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

Вы не объявили 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?

Ответ 3

Я хотел бы иметь декларацию struct foo внутри файла.c, но с функциями, которые имеют параметры foo в файле.h. Можно ли это сделать без компилятора с предупреждением?