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