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. Можно ли это сделать без компилятора с предупреждением?