2013-08-18 126 views
1

到一個完整的對象類型的指針我試圖所以我不得不作出一些小的改動,以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)

+0

哪裏' AQ_REAR _()'宏函數?在'arrayqueue.h'中加入 –

+0

@GrijeshChauhan,添加源代碼 – JRomero

回答

0

所以,我已經找到了問題......看來,真正的問題是,這種方法試圖增加緩衝區套接字的地址,但結構已iov_base定義爲void *所以編譯器不知道如何增加。 (得到了Error: expression must be a pointer to a complete object type (?)答案)

iovec的聲明:

struct iovec 
{ 
    void *iov_base; // starting address of buffer 
    int iov_len; // size of buffer 
}; 

的解決辦法是將它轉換爲已知類型但不幸的是,我不知道是什麼類型...

0

這可能是結構iovec的沒有在你的代碼中定義的某種方式。

struct _ioq_node { 
    struct iovec *vec; // <-------- 
    int autofree; 
}; 

轉儲預處理器輸出並檢查定義。使用gcc命令行並將-c選項替換爲-E(並將-o選項設置爲任何要輸出的位置)。

gcc -E -o <op> ... 
相關問題