#c
#c
Вопрос:
В одном файле у меня есть это:
#include <stdio.h>
#include <stdlib.h>
static struct node* mynode;
struct node*
example(void)
{
mynode = malloc(sizeof(struct node));
...fill up the struct here...
return mynode;
}
Вызывающая процедура:
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
mynode=example();
}
Сам узел определен в файле defs.h, который я здесь не показываю.
Предупреждение, которое я получаю при компиляции с помощью gcc, звучит так: «присваивание создает указатель из целого числа без приведения» в вызывающей процедуре.
Изменение на mynode=(struct node*)example(); удаляет это предупреждение. Процедура работает в любом случае, но я не понимаю, почему я получаю предупреждение.
Комментарии:
1. @JamesMorris — Да, я включил файл defs, но забыл свой заголовок.
Ответ №1:
Может быть, вы не объявили прототип для struct node* example(void)
, и компилятор думает, что он возвращает an int
?
Ответ №2:
При вызове файла example
возвращаемый тип example
неизвестен, поэтому предполагается, что он возвращает значение int, которому вы присваиваете struct node *
. Отсюда и предупреждение.
Вы должны либо объявить прототип for example
в вызывающем файле (ввод struct node* example(void);
перед вызывающей функцией), либо (лучше) создать файл заголовка с именем, скажем, example.h , где вы вводите прототип, а затем включаете файл заголовка в вызывающий файл (то есть ввод #include "example.h" at the top). The header file thus defines the interface of the file where
example` являетсяlocated , и файлы, использующие функции, могут включать файл заголовка, что позволяет убедиться, что все типы совпадают, и удалить все предупреждения компилятора.
Комментарии:
1. Ого! И в этом проблема. У меня был заголовочный файл, но я его не включил. Спасибо.