c语言 - 不能将类型为"void"的值分配给类型为"void(*)(struct *Queue, int)"的实体



我有以下结构:

typedef struct{
    int *arr;
    int maxSize, curSize;
    int first, last;
    int(*isEmptyFunc)(Queue);
    int(*isFullFunc)(Queue);
    void(*EnqueueFunc)(struct Queue*, int);
    void(*DequeueFunc)(struct Queue*);
    int(*TopFunc)(Queue);
} Queue;

和一个将指针返回新队列的创建队列函数:

    int *arr = malloc(sizeof(int) * size);
    isNull(arr);
    Queue *q = malloc(sizeof(Queue));
    isNull(q);

当我尝试将值分配给函数指针时,我确实可以:(这一切都发生在CreateQueue函数中)

q->isEmptyFunc = isEmpty(*q);
q->isFullFunc = isFull(*q);
q->TopFunc = Top(*q);
q->DequeueFunc = Dequeue(q);

实际功能在.c文件顶部包含的标头文件中声明,并在CreateQueue Func下方实现。前三个作业似乎很好,但是对于第四个编译器尖叫:

IntelliSense: a value of type "void" cannot be assigned to an entity of type "void (*)(struct Queue *)" 

Dequeue函数实现是:

void Dequeue(Queue *q) {
    if (q->isEmptyFunc()) return;
    q->first = (q->first + 1) % (q->maxSize);
    q->curSize--;
}

这里是怎么回事?

这里的主要问题是,isEmptyFuncisFullFuncEnqueueFuncDequeueFunc,都是函数pointers 。您正在尝试放置一个函数调用的返回值(在这里,这不是函数指针,我们可以假设)。那完全是错误的。它是不是罚款,您不应该这样做。

现在,如果我们看到,在您的情况下

前三个作业似乎很好,

编译器在这里不抱怨,因为所有三个函数呼叫都返回一些值(可能是int?),这是隐式转换为 function pointer 类型,但是,行为未定义。您不得做做。

,但对于第四个编译器尖叫:

在这种情况下,Dequeue()函数返回类型为void,不能用作A value 。因此,编译器是(值得庆幸的)抱怨。

tl; dr 您需要更改所有上述语句。

相关内容

最新更新