[c] C의 구조체 멤버에 대한 기본값

일부 구조체 멤버에 대해 기본값을 설정할 수 있습니까? 다음을 시도했지만 구문 오류가 발생했습니다.

typedef struct
{
  int flag = 3;
} MyStruct;

오류 :

$ gcc -o testIt test.c
test.c:7: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token
test.c: In function ‘main’:
test.c:17: error: ‘struct <anonymous>’ has no member named ‘flag’



답변

구조는 데이터 유형 입니다. 데이터 유형에 값을 제공하지 않습니다. 데이터 유형의 인스턴스 / 객체에 값을 제공합니다.
따라서 C에서는 불가능합니다.

대신 구조 인스턴스에 대한 초기화를 수행하는 함수를 작성할 수 있습니다.

또는 다음을 수행 할 수 있습니다.

struct MyStruct_s 
{
    int id;
} MyStruct_default = {3};

typedef struct MyStruct_s MyStruct;

그런 다음 항상 새 인스턴스를 다음과 같이 초기화하십시오.

MyStruct mInstance = MyStruct_default;


답변

이런 식으로 할 수 없습니다

대신 다음을 사용하십시오.

typedef struct
{
   int id;
   char* name;
}employee;

employee emp = {
.id = 0,
.name = "none"
};

매크로를 사용 하여 인스턴스 를 정의 하고 초기화 할 수 있습니다 . 이렇게하면 새 인스턴스를 정의하고 초기화 할 때마다 더 쉽게 만들 수 있습니다.

typedef struct
{
   int id;
   char* name;
}employee;

#define INIT_EMPLOYEE(X) employee X = {.id = 0, .name ="none"}

직원 유형으로 새 인스턴스를 정의해야 할 때 코드에서이 매크로를 다음과 같이 호출하면됩니다.

INIT_EMPLOYEE(emp);


답변

C에서 구조를 정의 할 때 초기화 할 수 없다는 Als에 동의합니다. 그러나 아래와 같이 인스턴스 생성시 구조를 초기화 할 수 있습니다.

C에서는

 struct s {
        int i;
        int j;
    };

    struct s s_instance = { 10 ,20 };

C ++에서는 아래와 같이 구조 정의에 직접적인 가치를 부여 할 수 있습니다.

struct s {
    int i;

    s(): i(10)
    {
    }
};


답변

넌 할 수있어:

struct employee_s {
  int id;
  char* name;
} employee_default = {0, "none"};

typedef struct employee_s employee;

그런 다음 새 직원 변수를 선언 할 때 기본 초기화를 수행하는 것을 기억해야합니다.

employee foo = employee_default;

또는 팩토리 함수를 통해 항상 직원 구조체를 구축 할 수 있습니다.


답변

사용하는 경우 개체 생성에 gcc줄 수 있습니다 designated initializers.

typedef struct
{
   int id=0;
   char* name="none";
}employee;

employee e =
{
 .id = 0;
 .name = "none";
};

또는 단순히 배열 초기화와 같이 사용하십시오.

employee e = {0 , "none"};


답변

다른 답변에서 언급했듯이 기본 구조체를 만듭니다.

struct MyStruct
{
    int flag;
}

MyStruct_default = {3};

그러나 위의 코드는 헤더 파일에서 작동하지 않습니다 multiple definition of 'MyStruct_default'. 오류가 발생 합니다.. 이 문제를 해결하려면 extern헤더 파일에서 대신 사용 하십시오.

struct MyStruct
{
    int flag;
};

extern const struct MyStruct MyStruct_default;

그리고 c파일에서 :

const struct MyStruct MyStruct_default = {3};

이것이 헤더 파일에 문제가있는 사람에게 도움이되기를 바랍니다.


답변

더욱이 기존 답변을 추가하려면 구조체 이니셜 라이저를 숨기는 매크로를 사용할 수 있습니다.

#define DEFAULT_EMPLOYEE { 0, "none" }

그런 다음 코드에서 :

employee john = DEFAULT_EMPLOYEE;