【问题标题】:Using pthread on Linux 2.4 - getting "incomplete type" compilation error在 Linux 2.4 上使用 pthread - 出现“不完整类型”编译错误
【发布时间】:2011-05-15 21:53:48
【问题描述】:

我正在使用 Linux 2.4(为我的操作系统课程做硬件), 我想使用 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 的类型不完整”。

我不知道为什么会收到此错误(或如何修复它...)。

感谢您的帮助,谢谢!

【问题讨论】:

    标签: linux pthreads incomplete-type


    【解决方案1】:

    您需要将结构定义从源文件移动到头文件。

    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
    

    【讨论】:

      【解决方案2】:

      您的链表 C 文件不知道 struct readers_writers_t,它是在您的 rw_lock.c 文件中定义的。

      1. 你应该将你的结构体 reader_writers_t 从 rw_lock.c 移到你的 rw_lock.h 文件中。

      2. 或者您可能不希望您的链表知道该结构。在这种情况下,您应该将 readers_writers rwLock 定义为指针 (readers_writers *rwLock)。另一种选择是 使您的 reader_writers typedef 成为指针:typedef struct readers_writers_t *readers_writers 这要求 rw_lock.c 中的函数为实际结构分配空间,因为这是唯一知道实际结构的文件。

      【讨论】:

      • 谢谢,为什么如果列表不知道 struct reader_writers_t 我得到的类型不完整,但是指向 struct reader_writers_t 的指针就可以了?
      • 如果你使用结构体本身,你的链表必须知道它是如何定义的,否则它不知道为它分配多少存储空间。当您使用指针时,编译器知道它所要做的就是为指针分配足够的存储空间,编译器将所有指针视为相同并且不需要结构本身。但是,如果要取消引用指针以使用任何结构成员,则需要提供结构定义。
      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多