Прежде всего, я не понимаю, что такое «тег».
В Википедии есть достаточно хорошее обсуждение общей концепции , которая начинается со списка синонимов, включая «теговое объединение».На самом деле, «теговый союз» является основным заголовком статьи, а непересекающийся союз является одним из синонимов.Он начинается с довольно краткого объяснения:
структура данных, используемая для хранения значения, которое может принимать несколько различных, но фиксированных типов.Только один из типов может использоваться одновременно, и поле tag явно указывает, какой из них используется.
Вы продолжаете спрашивать,
Если «теги» важны, почему у «С» есть один?
Насколько важны теги в этом контексте, это вопрос языкового дизайна, на котором написаны C, Pascal и SMLзанять разные позиции.Поскольку C склонен придерживаться довольно низкоуровневого подхода к большинству вещей и предоставить пользователям большой контроль, неудивительно, что он не заставляет использовать теги.Пользователи, которым нужны теги, могут сами сравнительно легко их реализовать, как я это делал иногда.
В качестве альтернативы было бы проще сказать, что C не имеет теговых союзов, каквообще встроенная языковая функция, только простые, без тегов союзы.С этой точки зрения, если вы хотите пометить объединение в C, вы должны реализовать его самостоятельно.Возможно, это наиболее последовательное мнение, но я понимаю, что оно отличается от того, которое представлено в материале, который вы изучали.
В чем разница между этими союзами.
Это разные реализации схожей концепции, предоставляемые разными языками.Полный анализ будет выходить за рамки разумного ответа SO.Как и многие вещи в области компьютерных наук и в других местах, абстрактная идея о несвязанных объединениях *1031* может быть реализована множеством различных способов.
Кроме того, я не нашел никакого материала, связанного сна «тег» союзов.
См. выше, и связанную статью Wikipedia.Я уверен, что вы также можете найти гораздо больше материала, особенно со списком синонимов WP для работы.
Далее, что означает «проверка во время выполнения», проверка чего?
Я должен был бы увидеть контекст и точное утверждение, чтобы быть уверенным, но, вероятно, ваш источник говорил о проверке одной или нескольких из следующих вещей:
- , чтотег конкретного экземпляра объединения является одним из тех, которые определены для этого типа объединения, или
- , что содержимое объединения имеет тип, указанный тегом, или
- , чтоСписок альтернативных действий (см. ниже) охватывает все возможные альтернативы.
Было бы здорово увидеть примеры с примерами этих функций.
Мой Паскальслишком ржавый, чтобы быть полезным, и я не знаю SML.Даже поучительный пример C может быть поучительным, однако:
enum my_tag { INT_TAG, STRING_TAG, DOUBLE_TAG };
union disjoint_union {
struct {
enum my_tag tag;
int an_int;
};
struct {
enum my_tag tag_s;
char *a_string;
};
struct {
enum my_tag tag_d;
double a_double;
};
};
union disjoint_union u = { .tag = INT_TAG, .an_int = 42 };
union disjoint_union u2 = { .tag = STRING_TAG, .a_string = "hello" };
union disjoint_union u3 = { .tag = DOUBLE_TAG, .a_double = 3.14159 };
Поскольку это C, тег предоставляется вручную и явно, и язык не выделяет его специально.Кроме того, программист должен убедиться, что содержимое объединения имеет правильный тег.
Вы можете использовать такую функцию с такой функцией, которая опирается на тег, чтобы определить, как обрабатывать экземплярыТип соединения:
void print_union(union disjoint_union du) {
switch (du.tag) {
case INT_TAG:
printf("%d", du.an_int);
break;
case STRING_TAG:
printf("%s", du.a_string);
break;
case DOUBLE_TAG:
printf("%f", du.a_double);
break;
}
}