Конфликт типа для ошибки функции
Это моя первая программа на C, и я не знаю, почему я получаю ошибку ниже.
#include <stdio.h>
#include <stdlib.h>
typedef struct {
struct ListNode* next;
int content;
} ListNode;
int main() {
//puts("Hello UPC World"); /* prints Hello UPC World */
//ListNode* h = malloc(sizeof(ListNode));
gridinit(3, 5);
//int c = h->content;
//printf("%d",c);
return EXIT_SUCCESS;
}
ListNode* gridinit(int numcolumns, int numrows) {
ListNode* head = malloc(sizeof(ListNode));
head->content = 2;
head->next = NULL;
return head;
}
Почему я получаю сообщение об ошибке
конфликт типов в func gridinit()
5 ответов
Определите объявление вашей функции в начале вашей структуры
ListNode* gridinit(int numcolumns, int numrows);
typedef struct {
struct ListNode* next;
int content;
} ListNode;
int main() {
//puts("Hello UPC World"); /* prints Hello UPC World */
//ListNode* h = malloc(sizeof(ListNode));
gridinit(3, 5);
//int c = h->content;
//printf("%d",c);
return EXIT_SUCCESS;
}
ListNode* gridinit(int numcolumns, int numrows) {
ListNode* head = malloc(sizeof(ListNode));
head->content = 2;
head->next = NULL;
return head;
}
Добавить предварительную декларацию для gridinit()
и все отлично работает
...
typedef struct {
struct ListNode* next;
int content;
} ListNode;
// Declare the gridinit function
ListNode* gridinit(int, int);
...
Это потому, что ваша функция определяется после ее вызова. Вы можете объявить прототип функции сразу после вашего struct
и раньше main
как
ListNode* gridinit(int numcolumns, int numrows);
и ты будешь хорош для компиляции.
TL; DR answer - Для всех функций, которые используются (вызываются) до того, как они определены, вам необходимо добавить предварительное объявление для этих функций перед функцией вызывающей стороны. В этом случае в качестве определения gridinit()
написано после main()
а также main()
использования gridinit()
Вы должны добавить предварительную декларацию gridinit()
до main()
и тебе будет хорошо идти.
Чтобы уточнить случай, в вашем main()
функция, ты звонишь gridinit()
, но до этого момента компилятор не имеет представления о прототипе gridinit()
функция.
Из-за обратной совместимости, функция, называемая неявным объявлением функции, предполагает, что функция, которая использовалась до того, как была определена или объявлена, принимает любое количество параметров и возвращает int
,
Позже, когда вы на самом деле определяете функцию, вы делаете тип возвращаемого значения как ListNode*
, что создает конфликт здесь.
FWIW, в соответствии с C99
стандартно (далее), (злая) особенность неявного объявления функции была официально удалена, но компиляторы все еще продолжают поддерживать то же самое для унаследованного кода. Если вы включаете предупреждения компилятора и компилируете со строгим соответствием, ваш компилятор должен предупреждать (или даже останавливать), в случае, если отсутствует предварительное объявление.
Там должно быть объявление или определение gridinit
прежде чем он вызывается в main
(компилятор должен знать, что он существует).
Кроме того, вы не должны игнорировать возвращаемое значение gridinit
, который возвращает указатель, для которого вы выделили память (игнорирование которого приведет к утечке памяти), вместо этого вы должны назначить его h
без выделения памяти в main
(потому что вы делаете это уже в gridinit
).
#include <stdio.h>
#include <stdlib.h>
typedef struct {
struct ListNode* next;
int content;
} ListNode;
ListNode* gridinit(int numcolumns, int numrows) {
int main() {
//puts("Hello UPC World"); /* prints Hello UPC World */
ListNode* h = gridinit(3, 5);
int c = h->content;
printf("%d",c);
return EXIT_SUCCESS;
}
ListNode* gridinit(int numcolumns, int numrows) {
ListNode* head = malloc(sizeof(ListNode));
head->content = 2;
head->next = NULL;
return head;
}