Инициализировать указатель на структуру с составным литералом
Я новичок в C и пытаюсь понять синтаксис составных литералов. Мой вопрос похож на инициализацию указателя на составные литералы в C, но я не думаю, что это отвечает. Если есть структура и тип, определенный как указатель на структуру, вот так:
typedef struct thing *thing_t;
struct thing
{
int id;
char *name;
};
Тогда я могу создать thing_t
как это:
thing_t instance = & (struct thing) {
.id = 1,
.name = "A"
};
Мне было интересно, если есть способ инициализировать thing_t
без явной ссылки на struct thing
Например, я попытался это, чтобы увидеть, был ли это правильный синтаксис:
thing_t instance = (* thing_t) {
.id = 1,
.name = "A"
};
но ошибки компилятора. Компилятор должен "знать", что thing_t
Тип содержит указатель на thing
, но есть ли синтаксис, который позволяет использовать два взаимозаменяемо в этом контексте?
(У меня нет конкретного варианта использования для этого, я просто пытаюсь понять, как связаны тип и структура).
1 ответ
Мне было интересно, если есть способ инициализировать
thing_t
без явной ссылки наstruct thing
Например, я попытался это, чтобы увидеть, был ли это правильный синтаксис:thing_t instance = (* thing_t) { .id = 1, .name = "A" };
но ошибки компилятора. Компилятор должен "знать", что тип thing_t содержит указатель на вещь,
Да, это так, хотя это плохая форма для определения псевдонима типа, который скрывает природу указателя, как вы это сделали, и это особенно плохая форма, чтобы делать это с именем, которое каким-то образом не дает подсказки об этом.
но есть ли синтаксис, который позволяет использовать два взаимозаменяемо в этом контексте?
Синтаксис составного литерала включает указатель типа в скобках. Это не актерский состав, это часть самого литерала. Вы не можете обойтись без этого. Если вы хотите избежать высказывания struct
тем не менее, тогда вы можете убить двух зайцев одним выстрелом, изменив псевдоним типа так, чтобы он описывал сам тип структуры, а не указатель на один:
typedef struct thing thing_t;
struct thing {
int id;
char *name;
};
thing_t *instance = & (thing_t) {
.id = 1,
.name = "A"
};
Это не только работает, но и намного яснее, чем ваше предложение. Например, использование &
Оператор совпадает с явным объявлением переменной instance
в качестве указателя.