programing

C++ 및 C에서 Union 초기화

easyjava 2023. 9. 16. 10:04
반응형

C++ 및 C에서 Union 초기화

다음과 같이 정의된 헤더 파일에 상수를 사용하는 작동 C 라이브러리를 만들었습니다.

typedef struct Y {
  union {
    struct bit_field bits;
    uint8_t raw[4];
  } X;
} CardInfo;

static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } };

저는 알고 있습니다..rawinitializer는 C only 구문입니다.

C 및 C++에서 사용할 수 있도록 결합이 있는 상수를 정의하려면 어떻게 해야 합니까?

저도 같은 문제가 있었습니다.C89의 경우는 다음과 같습니다.

C89 스타일 이니셜라이저의 경우 선언된 순서대로 구조 구성원을 초기화해야 하며, 조합의 첫 번째 구성원만 초기화할 수 있습니다.

구조조합의 초기화에 대한 설명을 찾았습니다.

C++11을 사용하면 다음과 같이 자신의 컨스트럭터를 작성할 수 있다고 생각합니다.

union Foo
{
    X x;
    uint8_t raw[sizeof(X)];

    Foo() : raw{} { }
};

이 기본값은 유형 조합을 초기화합니다.Foo현역으로raw, (C++11 이전에는 완전한 개체가 아닌 배열을 초기화할 방법이 없었습니다.)

저는 다음과 같은 길을 선택하기로 했습니다.

  • 사용하지않음.member초기화
  • 쓸모가 없는static const struct Foobar구성원의 초기화

대신 글로벌 변수를 선언합니다.

extern "C" {
  extern const struct Foobar foobar;
}

글로벌 섹션에서 초기화합니다.

struct Foobar foobar = { 0, 0, 0, 0 };

그리고 현대 ANSI C99 구문으로 C++ 컴파일러를 도청하는 대신에 나는 링커가 C 심볼을 디매그링하는 작업을 하도록 했습니다.

언급URL : https://stackoverflow.com/questions/11555702/union-initialization-in-c-and-c

반응형