구조체 이니셜 라이저에서 점 (.)은 무엇을 의미합니까?


117
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

이 C 구문을 잘 이해하지 못합니다. 구문 이름을 모르기 때문에 검색도 할 수 없습니다. 그게 뭔데?


구조체 이니셜 라이저처럼 보입니다.
Mysticial 2011

7
C99로 표준화되었으므로 (정말) 오래된 컴파일러가 있으면 작동하지 않습니다.
일부 프로그래머 친구

2
마침내 이것에 대한 링크를 찾았습니다 : stackoverflow.com/questions/330793/…
Mysticial

5
불행히도 MSVC의 현재 버전조차도이 표준에 따르면 '(정말) 오래된 컴파일러'입니다.
Jonathan Leffler 2011

절대적으로 기이 한, 나는 퓨즈 튜토리얼을 살펴보고 똑같은 이니셜 라이저를 작성하면서이 질문을 검색했습니다.
Keegan Jay

답변:


141

이니셜 라이저에서 이름으로 구조체의 특정 필드를 설정할 수있는 C99 기능입니다. 이 전에 초기화 프로그램은 모든 필드에 대해 순서대로 값만 포함해야했습니다. 물론 여전히 작동합니다.

따라서 다음 구조체의 경우 :

struct demo_s {
  int     first;
  int     second;
  int     third;
};

...당신이 사용할 수있는

struct demo_s demo = { 1, 2, 3 };

...또는:

struct demo_s demo = { .first = 1, .second = 2, .third = 3 };

...또는:

struct demo_s demo = { .first = 1, .third = 3, .second = 2 };

... 마지막 두 개는 C99 전용입니다.


도트 초기화가 C ++에서도 작동합니까? (나는 그것을 테스트해야합니다)
가브리엘 스테이 플스

1
문서를 살펴보면 C ++ 20에만 해당되는 것으로 보입니다. 다음은 C (C99부터 작동)에 대한 cppreference.com 문서입니다. en.cppreference.com/w/c/language/struct_initialization 및 C ++ (C ++ 20에서만 작동) : en.cppreference.com/w/cpp / language / aggregate_initialization .
Gabriel Staples

방금 gcc를 사용하여 C ++에 대해이 "점 초기화"유형 양식을 시도했으며 gcc C ++의 모든 버전이이를 지원하는 것으로 보이므로 gcc 확장으로 gcc에서 지원한다고 확신합니다. 즉, C ++ 20 이전에는 비 gcc / g ++ 컴파일러에 반드시 이식 할 수있는 것은 아닙니다. 그래도 gcc / g ++ 컴파일러를 사용하고 있으므로 C ++ 용 gcc에서 지원하는 경우 사용하는 것이 좋습니다.
Gabriel Staples

점 초기화에 잠재적 인 문제가 있습니다 (적어도 일부 컴파일러에서는). struct demo_s demo = { .first = 1, .first = 9 };내 GCC 중 하나에서 이것은 경고없이 컴파일되고 첫 번째는 9가 될 것입니다.
Renate


15

designated initialisation( 지정된 이니셜 라이저 참조 ) 로 알려져 있습니다. "initializer-list", 각각의 ' .'는 ' '이며, designator이 경우 fuse_oprations' hello_oper'식별자로 지정된 개체에 대해 초기화 할 ' '구조체 의 특정 멤버를 명명합니다 .


0

전체 구문은 COD3BOY에서 이미 언급했듯이 지정된 이니셜 라이저로 알려져 있으며 일반적으로 선언시 구조를 특정 또는 기본값으로 초기화해야 할 때 사용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.