2016-08-17 3 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}; 

하고 있습니다.

그래서 모든 변수가 다른 변수에 의존하기 때문에 변수의 선언과 분리를 구분해야합니다. 에 대한 등등

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

과 : 헤더 파일에서 내가 선언

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

등 ... 및 기능에서이 .c 파일에 내가 초기화 한 변수를 작성했습니다 다른 회원 및 변수.

그러나 난 내 변수 const 할 것을 권장합니다

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

그래서 제 질문은 선언과 내가 정의한 유형의 const 변수의 정의를 separing에 관한 것입니다. 어떻게해야합니까? 내가 뭐 잘못하고 있니?

자연스럽게 선언문에 const을 추가하면 변수를 초기화 할 때 컴파일러에서 오류를보고합니다 (읽기 전용 변수를 쓰려고합니다).

+0

에 정의를 진행 {TITLE_1을, menuEntry_2는, menuEntry_4는, menuEntry_1, menuEntry_5}', 왜 menu_init''에서 다시 초기화 것인가? – user694733

+0

구조체에 이러한 전역 변수에 대한 포인터가 * 포함되어 있으므로 간단하게 정의하고 한 줄로 초기화 할 수 있어야합니다. 즉 초기화 할 함수가 필요하지 않습니다.* "모든 변수는 다른 변수에 의존합니다"*, 그러나 'menuEntry_1'내용을 변경하면 '& menuEntry_1'이 변경되는 것은 아닙니다. – Groo

+0

@ user694733 :'const '로 사용하지 않으면'menu_init'에서 변수를 초기화합니다. 그러나'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 const을 사용하십시오. extern은 메모리를 할당하지 않고 프로그램에서 사용할 변수 만 선언합니다. 이미`menuEntry_1 =와 변수 초기화하기 경우 그런 다음 주 const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on