2012-10-17 81 views
0

這似乎是一個容易解決的問題,但我做錯了什麼。我已經通過所有類似的線程,並沒有發現任何解決我的問題,所以任何幫助將不勝感激!數組的結構 - 數組具有不完整的元素類型(在C中)

基本上:C程序,我試圖創建一個bufferevents數組。

#include <event2/listener.h> 
#include <event2/bufferevent.h> 
#include <event2/buffer.h> 

extern struct bufferevent bev[8]; 

//Then, my accept functions -- well, one of them... 
static void accept1(struct evconnlistener *listener, 
    evutil_socket_t fd, struct sockaddr *address, int socklen, 
    void *ctx) { 
    /* A new connection was received on this port */ 
    struct event_base *base = evconnlistener_get_base(listener); 
    bev[0] = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); 

    /* Callback for when (*bufevent, data READ, data WRITTEN, event OCCURRED, *void) */ 
    bufferevent_setcb(bev[0], read1, NULL, echo_event_cb, NULL); 
} 

當我嘗試編譯(WITH -levent,我可以補充)我得到這個錯誤:

src/mix/mix1.c:57:34: error: array type has incomplete element type

任何想法? (

注意:我定義了主要以外的bufferevents,使它們在我的代碼中無處不在,而且沒有通過它們。我在該區域有其他#define,所以我確信這是與我的方式有關「M構建他們?

+0

什麼行會導致錯誤? – ouah

+0

mix1.c中的第57行是什麼意思? – harald

+0

我可以看到,bev [0]是'struct bufferevent'類型,而'bufferevent_socket_new'則返回一個指向'struct bufferevent'的指針,'bufferevent_setcb'也將一個指針作爲參數。 – SirDarius

回答

3

struct bufferevent只宣佈爲libevent的公共報頭一個不完整的類型,其內容被隱藏於公共API的用戶上bufferevents操作採取指針到bufferevent所有的libevent功能。 ,所以你想要的是

struct bufferevent *bev[8]; 

進一步注意,你不想在該聲明上放置extern,否則鏈接時你會得到一個未定義的符號錯誤。如果僅在文件中提及,則應該使用static代替。否則,應在標題文件以及externextern您所顯示的文件中聲明extern

+0

啊,我明白了!這就說得通了。這也確實解決了我的問題。謝謝!! (另外,我對'extern'的含義感到困惑,所以謝謝澄清...我回頭重讀了關於該修飾符的內容。) –

相關問題