2012-04-16 6 views
2

구조체에서 유니온을 초기화하는 문제와 관련하여 stackoverflow를 탐색했지만 올바른 결과를 얻을 수 없었습니다. 여기 구조체에서 유니온 초기화

내 구조체

내 코드에서
typedef struct dc_netif_filter { 
    unsigned char filter_type; 
    union { 
     uint32_t itf_nb; 
     char * buf; 
    } value; 
} dc_netif_filter_t; 

, 내가 사용하는 것을 시도했다 :

오류 제공
dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,{{0, "tun"}}}; 

형식 'uint32_t'

및 대한 스칼라 이니셜 주위에 중괄호

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,{0, "tun"}}; 

: 'dc_netif_filter :: < 익명 공용체에 대한 초기화 프로그램이 너무 많음' '

어떻게 이러한 dc_netif_filter_t를 선언합니까?

나는 우분투에서 g ++를 사용하고 있습니다. dc_netif_filter_t는 제 3 자 프로젝트에서 제공하는 것처럼 수정할 수있는 구조체가 아닙니다.

** 편집 : 설명 했으므로 필드 하나만 초기화 할 수 있습니다. uint32_t '에

감사

+3

유니온 멤버 중 하나만 초기화합니다. – Nick

+0

* 모든 * 유니온의 멤버를 초기화하고 싶지는 않습니다. 방법에 대해 :'dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, "tun"}; ' – trojanfoe

+0

그럼 buf를 "tun"으로 설정하고 나서 itf_nb를 0으로 설정합니까? – djfoxmccloud

답변

6

컴파일러가 말한대로, too many initializers for ‘dc_netif_filter::< anonymous union>’을'CONST의 char * '에서 유효하지 않은 변환 : 문제는

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME,"tun0"}; 

와 나는 변환 오류가 발생한다는 것입니다.

필드 하나만 초기화하고 둘 다 초기화하지 않습니다.

가 제대로 초기화 할 필드의 이름을 사용이 만 C하지 있어야하는

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, {.buf="tun"}}; 

비록 지정된 초기화 :

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { buf: "tun0" }}; 
+1

필드 만 초기화하면 편집 내용이 흥미 롭습니다 (OP 편집 참조). 변환 오류가 발생했습니다. – djfoxmccloud

+0

편집 된 답변보기. –

+1

이것이 비표준 g ++ 확장이라고 생각합니다. – Nick

1

이 g ++ 4.7.0에서 작동 C++! 어쩌면 GNU 확장일까요?

내가 제일 (가장 호환) 방법은 초기화 후 구성원을 지정하는 것입니다 같아요

dc_netif_filter_t netif; 
netif.itf_nb = DC_NETIF_SELECT_NAME; 
netif.value.buf = "TUN"; 
+0

':'토큰 앞에 예상 기본 표현이 있습니다. 누락 된 컴파일러 옵션이 있습니까? – djfoxmccloud

+0

아니요, 명령 줄 옵션을 사용하지 않았습니다. 컴파일러 버전에 의존해야한다고 생각합니다. 내가 말했듯이 어쨌든 C++로 작동하지 않아야합니다. – trojanfoe

+0

나는 그것이 "C++에서 작동하도록되어있다"는 것이 아니라,이 코드를 "있는 그대로"컴파일해야한다는 것을 이해한다;) g ++ 4.4.3에서는 작동하지 않고 업그레이드를 시도 할 것이다 – djfoxmccloud

2

그것은 당신이 buf 멤버가 사용된다는 것을 나타냅니다하기 위해 구조를 초기화하려고하는 것처럼 보이고, buf의 값은 "tun"이어야합니다. C++ 11 지정된 초기화이 부족하기 전에 ++ C 때문에, 당신은 초기화와 함께 할 수없는 다음 union의 첫 번째 필드가 초기화 할 수 있습니다, 당신은 코드에 할당 할 필요가 있도록 :

static get_dc_netif_filter_t() { 
    static c_netif_filter_t netif = {DC_NETIF_SELECT_NAME, {0}}; 
    if (netif.value.itf_nb == 0) { 
     netif.value.buf = "tun"; 
    } 
    return netif; 
} 

C를 ++ 11을 사용하면 이렇게 할 수 있습니다.

dc_netif_filter_t netif = {DC_NETIF_SELECT_NAME, { .buf = "tun"}}; 
+0

얻을 수 있습니다 : '.'토큰 앞에 예상 주 표현식 누락 된 컴파일러 옵션이 있습니까? – djfoxmccloud

+0

@djfoxmccloud try'-std = C++ 11' – dasblinkenlight

+0

올바르지 않습니다. 지정된 초기화 프로그램은 C++ 11에 없습니다. 현재 C++ 20 용으로 제안되어 있습니다 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf 참조). 그러나, 그들은 현재 MSVC뿐만 아니라 GCC, Clang에서 일하는 것 같습니다. – minexew