Компилятор жалуется на конфликтующие типы

0

Я пытаюсь создать связанный список, но при компиляции моего кода возникает следующая ошибка:

In file included from linkedlist.c:1:
linkedlist.h:9: warning: 'struct list_t' declared inside parameter list
linkedlist.h:9: warning: its scope is only this definition or declaration, which is probably not what you want
linkedlist.h:12: warning: 'struct list_t' declared inside parameter list
linkedlist.c: In function 'main':
linkedlist.c:11: warning: passing argument 2 of 'execute_choice' from incompatible pointer type
linkedlist.c: At top level:
linkedlist.c:28: error: conflicting types for 'execute_choice'
linkedlist.h:9: error: previous declaration of 'execute_choice' was here
linkedlist.c:56: error: conflicting types for 'create_node_in_linked_list'
linkedlist.h:12: error: previous declaration of 'create_node_in_linked_list' was here
linkedlist.h:9: warning: 'struct list_t' declared inside parameter list
linkedlist.h:9: warning: its scope is only this definition or declaration, which is probably not what you want
linkedlist.h:12: warning: 'struct list_t' declared inside parameter list
make: *** [all] Error 1

Однако я проверил как исходный файл, так и заголовочный файл, а функция "execute_choice" имела совпадающие объявления в обоих. Вот мои исходные и заголовочные файлы:

Исходный файл:

#include "linkedlist.h"

int main (void)
{
    int choice;
    list_t* list;
    list = (list_t*)sizeof(list_t);

    while (1) {
        choice = display_menu_choices();
        execute_choice(choice, list);
    }
}

int display_menu_choices(void)
{
    int menu_choice;

    printf ("Please select from the following options\n");
    printf ("0. Exit program\n");
    printf ("1. Generate a linkedlist\n");
    printf ("2. Sort a linkedlist\n");
    scanf ("%d", &menu_choice);

    return menu_choice;
}

void execute_choice(int menu_choice, list_t* list)
{
    switch (menu_choice) {
        case GEN_LL:
        generate_linked_list();
        break;

        case SORT_LL:
        sort_linked_list();
        break;

        case EXIT:
        exit(0);
    }

    return;
}

void generate_linked_list(void)
{
    return;
}

void sort_linked_list(void)
{
    return;
}

void create_node_in_linked_list(list_t* list)
{
    return;
}

Заголовок:

#include <stdlib.h>
#include <stdio.h>

#define EXIT 0
#define GEN_LL 1
#define SORT_LL 2

int display_menu_choices(void);
void execute_choice(int, struct list_t*);
void generate_linked_list(void);
void sort_linked_list(void);
void create_node_in_linked_list(struct list_t*);

typedef struct node_t{
    struct node_t* current;
    struct node_t* next;
    int value;
} node_t;

typedef struct list_t{
    struct node_t* start;
} list_t;

Кроме того, советы в целом приветствуются! Пожалуйста, критикуйте мой код, однако вы считаете нужным - я никогда не узнаю из своих ошибок, если никто их не укажет =) Спасибо !!!

  • 0
    Похоже, C, а не C ++. Какой компилятор вы используете, в какой системе?
  • 0
    typedef перейти к ранее прототипам.
Показать ещё 1 комментарий
Теги:
compiler-errors

2 ответа

3

Вы должны объявить тип, прежде чем пытаться его использовать.

Поэтому, если вы переместите определения /typedefs структуры перед прототипами функции, компилятор должен прекратить жаловаться на неявные/конфликтующие определения.

  • 0
    Понял, спасибо!
2

Порядок вещей внутри вашего файла заголовка неверен. typedef должен появиться перед определениями функций. Так двигаться

typedef struct node_t{
  struct node_t* current;
  struct node_t* next;
  int value;
} node_t;

typedef struct list_t{
  struct node_t* start;
} list_t;

до

int display_menu_choices(void);
void execute_choice(int, struct list_t*);
  • 0
    Спасибо за помощь - успешно скомпилировано!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню