C 表达式必须是指向宏中完整对象类型的指针
我正试图将libbeanstalk集成到一个嵌入式系统中,所以我不得不做一些小的修改。到目前为止,我已经能够替换/修复一些特定于操作系统的代码,但后来我遇到了这个错误。在“表达式必须是指向完整对象类型的指针”之前,我已经修复了这些类型的错误,但真正让我忘记的是,我确信宏和所用对象的标题是,在抛出编译器错误之前的几行使用了该宏。有人能帮我理解问题是什么吗 SourceC 表达式必须是指向宏中完整对象类型的指针,c,macros,beanstalkd,C,Macros,Beanstalkd,我正试图将libbeanstalk集成到一个嵌入式系统中,所以我不得不做一些小的修改。到目前为止,我已经能够替换/修复一些特定于操作系统的代码,但后来我遇到了这个错误。在“表达式必须是指向完整对象类型的指针”之前,我已经修复了这些类型的错误,但真正让我忘记的是,我确信宏和所用对象的标题是,在抛出编译器错误之前的几行使用了该宏。有人能帮我理解问题是什么吗 Sourcearrayqueue.h #ifndef ARRAYQUEUE_H #define ARRAYQUEUE_H #define A
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 */
Sourceioqueue.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 */
错误:
"..\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)
代码中可能没有定义struct iovec
struct _ioq_node {
struct iovec *vec; // <--------
int autofree;
};
struct\u ioq\u节点{
struct iovec*vec;//所以我发现了问题……看起来真正的问题是,这个方法试图增加套接字缓冲区的地址,但是struct将iov\u base
定义为void*
,所以编译器不知道如何增加。(从中得到答案)
iovec声明:
struct iovec
{
void *iov_base; // starting address of buffer
int iov_len; // size of buffer
};
解决方案是将其强制转换为已知类型,但不幸的是,我不知道该类型…Where isAQ\u REAR\u()
macro function?加载项question@GrijeshChauhan在arrayqueue.h
中,添加了源代码
gcc -E -o <op> ...
struct iovec
{
void *iov_base; // starting address of buffer
int iov_len; // size of buffer
};