到一個完整的對象類型的指針我試圖所以我不得不作出一些小的改動,以libbeanstalkd集成到嵌入式系統。到目前爲止,我已經能夠替換/修復一些操作系統特定的代碼,但是後來我發現了這個錯誤。我已經解決這些類型的錯誤,以前「表達式必須是一個指向一個完整的對象類型」但真正讓我除了事實,我敢肯定,在宏觀和使用的對象標題是這個宏在引發編譯器錯誤的地方使用了幾行。有人能幫我理解這個問題是什麼嗎?表達式必須是從宏
源arrayqueue.h
#ifndef ARRAYQUEUE_H
#define ARRAYQUEUE_H
#define AQ_DEFINE_STRUCT(struct_name, node_type) \
struct struct_name { \
node_type *nodes; \
size_t size; \
size_t used; \
off_t front; \
off_t rear; \
}
#define AQ_NODES_FREE(q) ((q)->size - (q)->used)
#define AQ_FULL(q) ((q)->used == (q)->size)
#define AQ_EMPTY(q) ((q)->used == 0)
#define AQ_REAR_(q) ((q)->nodes + (q)->rear)
#define AQ_REAR(q) (AQ_EMPTY(q) ? NULL : AQ_REAR_(q))
#define AQ_FRONT_(q) ((q)->nodes + (q)->front)
#define AQ_FRONT(q) (AQ_FULL(q) ? NULL : AQ_FRONT_(q))
#define AQ_DEQ_FIN(q) ((q)->rear = ((q)->rear + 1) % (q)->size, (q)->used--)
#define AQ_ENQ_FIN(q) ((q)->front = ((q)->front + 1) % (q)->size, (q)->used++)
#endif /* ARRAYQUEUE_H */
源ioqueue.h
:
#ifndef _IOQUEUE_H
#define _IOQUEUE_H
#include <stddef.h>
#include <vsocket.h>
#include "arrayqueue.h"
#include "verixmissing.h"
struct _ioq_node {
struct iovec *vec;
int autofree;
};
AQ_DEFINE_STRUCT(_ioq, struct _ioq_node);
typedef struct _ioq ioq;
typedef struct _ioq_node ioq_node;
#define IOQ_NODES_READY(q) ((q)->used ? ((q)->front <= (q)->rear ? (q)->size - (q)->rear : (q)->used) : 0)
#define IOQ_PEEK_POS(q, i) ((AQ_REAR_(q)+i)->vec)
#define IOQ_REAR_(q) IOQ_PEEK_POS(q,0)
#define IOQ_REAR(q) (AQ_EMPTY(q) ? NULL : IOQ_REAR_(q))
void ioq_enq_(ioq *q, void *data, ssize_t data_len, int autofree);
int ioq_enq(ioq *q, void *data, ssize_t data_len, int autofree);
ssize_t ioq_dump(ioq *q, int fd);
ioq *ioq_new(size_t size);
void ioq_free(ioq *q);
#endif /* _IOQUEUE_H */
源ioqueue.c
:
#include <stdlib.h>
#include <vsocket.h>
#include "arrayqueue.h"
#include "ioqueue.h"
...
ssize_t ioq_dump(ioq *q, int fd)
{
size_t bytes_expected = 0, nodes_ready = IOQ_NODES_READY(q), i;
ssize_t bytes_written, nodes_written = 0;
for (i = 0; i < nodes_ready; ++i)
bytes_expected += IOQ_PEEK_POS(q,i)->iov_len;
if ((bytes_written = writev(fd, IOQ_REAR_(q), nodes_ready)) < bytes_expected)
switch (bytes_written) {
case -1:
return -1;
default:
while ((bytes_written -= IOQ_REAR_(q)->iov_len) > 0) {
IOQ_DUMP_FIN(q, 1);
++nodes_written;
}
if (bytes_written < 0) {
IOQ_REAR_(q)->iov_base += IOQ_REAR_(q)->iov_len + bytes_written;
^---------------------- ERROR!
IOQ_REAR_(q)->iov_len = -bytes_written;
}
return nodes_written;
}
else {
IOQ_DUMP_FIN(q, nodes_ready);
return nodes_ready;
}
}
錯誤:
"..\Source\libs\libbeanstalkd\ioqueue.c", line 125: Error: #852: expression must be a pointer to a complete object type
IOQ_PEEK_POS(q, 0)->iov_base += IOQ_REAR_(q)->iov_len + bytes_written;
^
如果有幫助,Eclipse中的宏展開爲:((((q)->nodes + (q)->rear)+0)->vec)
哪裏' AQ_REAR _()'宏函數?在'arrayqueue.h'中加入 –
@GrijeshChauhan,添加源代碼 – JRomero