Использование pthread в Linux 2.4-получение ошибки компиляции" неполный тип"
Я работаю над Linux 2.4 (делаю h. w для моего O'S курса), Я хочу использовать pthread для реализации блокировки чтения-записи. В rw_lock.c у меня есть:
#include <pthread.h>
#include <stdlib.h>
#include "rw_lock.h"
struct readers_writers_t
{
int prio;
int number_of_readers;
pthread_cond_t no_readers;
int number_of_writers;
int number_of_waiting_writers;
pthread_cond_t no_writers;
pthread_mutex_t lock;
};
[functions...]
В rw_lock.h у меня есть:
typedef struct readers_writers_t readers_writers;
В другом файле C (реализация связанного списка) у меня есть:
#include "rw_lock.h"
struct LinkedList
{
ListNode* head;
ListNode* tail;
readers_writers rwLock;
};
(and more functions,includes etc').
Я получаю (одну) ошибку компиляции:
Я понятия не имею, почему я получаю эту ошибку (или как ее исправить...)."rwLock имеет неполный тип".
Помощь ценится, спасибо!
2 ответа:
Ваш файл связанного списка C не знает о
struct readers_writers_t
, он определен в вашем rw_lock.C файл.
Вы должны просто переместить свою структуру readers_writers_t из rw_lock.c и в ваш rw_lock.H файл.
Или, возможно, вы не хотите, чтобы ваш связанный список знал об этой структуре. В этом случае вы должны определить
readers_writers rwLock
скорее как указатель (readers_writers *rwLock). Другой альтернативой является: сделайте свой readers_writers typedef указателем:typedef struct readers_writers_t *readers_writers
Для этого необходимо, чтобы функции в rw_lock.c выделяет место для фактической структуры, поскольку это единственный файл, который знает о фактической структуре.
Вам нужно переместить определение структуры из исходного файла в файл заголовка.
Rw_lock.h должно быть:
#ifndef SOME_UNIQUE_STRING_MY_RW_LOCK_H #define SOME_UNIQUE_STRING_MY_RW_LOCK_H #include <pthread.h> struct readers_writers_t { int prio; int number_of_readers; pthread_cond_t no_readers; int number_of_writers; int number_of_waiting_writers; pthread_cond_t no_writers; pthread_mutex_t lock; }; typedef struct readers_writers_t readers_writers; #endif