2016-08-17 74 views
8

我正在用C編寫。Const自引用結構

我已經定義了一個由自引用結構構成的新類型(noFunc_menuEntry)。

struct noFunc_menuEntry_tag { 
    const char *text; 
    struct noFunc_menuEntry_tag *up_entry; 
    struct noFunc_menuEntry_tag *down_entry; 
    struct noFunc_menuEntry_tag *back_entry; 
    struct noFunc_menuEntry_tag *enter_entry; 
}; 
typedef struct noFunc_menuEntry_tag noFunc_menuEntry; 

我需要定義一系列的變量是這樣的:

menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; 
menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6}; 

等。

所以我需要分開變量的聲明和defing,因爲每個變量都依賴於其他變量。在頭文件中我寫的聲明

noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6; 

等等,而在功能.c文件我已經初始化變量:

void menu_init(void) 
{ 
     menuEntry_1.text = title; 
     menuEntry_1.up_entry = &menuEntry_2 
} 

等爲其他成員和變量。

但是我希望我的變量是const

const noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6; 

所以我的問題是關於separing聲明,我定義的類型const變量的定義。我能怎麼做?難道我做錯了什麼?

當然,如果我在聲明中簡單添加const,編譯器會在我初始化變量時報告錯誤(我試圖編寫只讀變量)。

+0

定義它繼續如果你已經初始化與'menuEntry_1 =變量{TITLE_1,與menuEntry_2,與menuEntry_4,與menuEntry_1,與menuEntry_5};',你爲什麼會再次'menu_init'初始化它們? – user694733

+0

因爲你的結構體包含這些(全局)變量的*指針*,我相信你應該能夠簡單地定義它們並在一行中初始化,即不需要有初始化函數。確實,*「每個變量都依賴於其他變量」*,但如果您要更改'menuEntry_1'內容,這並不意味着'&menuEntry_1'會改變。 – Groo

+0

@ user694733:我在'menu_init'中初始化變量,如果我不使用它們作爲'const',但是如果它們必須是'const',我自然不會使用'menu_init'。我正在尋找正確的方式來做到這一點! – BzFr

回答

6

如果你想要這些變量爲const,那麼你必須在沒有函數的情況下進行初始化。

但首先,讓我們來處理const在類型定義:

typedef struct noFunc_menuEntry_tag noFunc_menuEntry; 
struct noFunc_menuEntry_tag { 
    const char *text; 
    const noFunc_menuEntry *up_entry; 
    const noFunc_menuEntry *down_entry; 
    const noFunc_menuEntry *back_entry; 
    const noFunc_menuEntry *enter_entry; 
}; 

隨後的聲明頭文件:

extern const noFunc_menuEntry menuEntry_1; 
extern const noFunc_menuEntry menuEntry_2; 
... 

最後的定義和初始化在源文件:

const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; 
const noFunc_menuEntry menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6}; 
... 
6

你可能use an array,因爲一堆item_i意味着你可能需要。

typedef struct noFunc_menuEntry_tag { 
    const char *text; 
    const struct noFunc_menuEntry_tag *up_entry; 
    const struct noFunc_menuEntry_tag *down_entry; 
    const struct noFunc_menuEntry_tag *back_entry; 
    const struct noFunc_menuEntry_tag *enter_entry; 
} noFunc_menuEntry; 


int main(void) { 
    const noFunc_menuEntry menuEntry[4] = { 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
    }; 
    return 0; 
} 
+1

我認爲這是一個乾淨的方式來完成這項任務。 – haccks

1

在標頭的聲明中使用extern constextern只會聲明變量用於程序中,而不分配任何內存。 然後在主 const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on