2013-04-03 2 views
0

예를 들면 : 나는 심지어 무슨 뜻인지했던 이해할 수 없었다VC++ 2008에 있지만 원래의 기능을 변경하지 않고 C99 소스를 컴파일하는 방법

enum { 
    SPICE_MSG_CURSOR_INIT = 101, 
    SPICE_MSG_CURSOR_RESET, 
    SPICE_MSG_CURSOR_SET, 
    SPICE_MSG_CURSOR_MOVE, 
    SPICE_MSG_CURSOR_HIDE, 
    SPICE_MSG_CURSOR_TRAIL, 
    SPICE_MSG_CURSOR_INVAL_ONE, 
    SPICE_MSG_CURSOR_INVAL_ALL, 

    SPICE_MSG_END_CURSOR 
}; 

static const spice_msg_handler cursor_handlers[] = { 
    [ SPICE_MSG_CURSOR_INIT ]    = cursor_handle_init, 
    [ SPICE_MSG_CURSOR_RESET ]    = cursor_handle_reset, 
    [ SPICE_MSG_CURSOR_SET ]    = cursor_handle_set, 
    [ SPICE_MSG_CURSOR_MOVE ]    = cursor_handle_move, 
    [ SPICE_MSG_CURSOR_HIDE ]    = cursor_handle_hide, 
    [ SPICE_MSG_CURSOR_TRAIL ]    = cursor_handle_trail, 
    [ SPICE_MSG_CURSOR_INVAL_ONE ]   = cursor_handle_inval_one, 
    [ SPICE_MSG_CURSOR_INVAL_ALL ]   = cursor_handle_inval_all, 
}; 

. vC++ 2008에서 전달할 수 없습니다. 어떻게 변경할 수 있습니까?

답변

0

이는 C99에 도입 된으로 지정된 초기화 장치 입니다. 예를 들어, 배열을 초기화하기 위해, 당신은 어떤 순서로 배열 인덱스를 지정할 수 있습니다

int a[6] = { [4] = 29, [2] = 15 }; 

cursor_handlers가 초기화됩니다, 열거 형의 정의, 당신의 예에 따라서

int a[6] = { 0, 0, 15, 0, 29, 0 }; 

에 해당 101 요소가 0 인 경우 다른 여러 값

문제는 VC++ 2008이 C99의 대부분의 기능을 지원한다는 것입니다. 따라서 고정 된 순서 (이전 C89 방식)로 배열을 초기화하거나 모두 0으로 배열을 초기화하고 적절한 요소를 지정해야합니다.

는 C89의 방법으로 사용해야합니다 그래서 배열, const 너무 나쁜 : 그렇지 const을의 경우

static const spice_msg_handler cursor_handlers[] = {0, 0, /*...all 101 0s*/, cursor_handle_init, /*...*/} 

을, 당신은이를 사용할 수 있습니다

static spice_msg_handler cursor_handlers[SPICE_MSG_END_CURSOR] = {}; 
cursor_handlers[SPICE_MSG_CURSOR_INIT] = cursor_handle_init; 
cursor_handlers[SPICE_MSG_CURSOR_RESET] = cursor_handle_reset; 
//...