Мой вопрос: кроме того, что это плохая практика кодирования, есть ли какая-то причина, почему этот код неправильный (строго в смысле компилятора C)?
Не знаюОбязательно согласитесь, что кодекс демонстрирует плохую практику.Это, безусловно, допустимо, так как типы структур не нужно объявлять с помощью тегов в C. На типы структур без тегов нельзя напрямую ссылаться вне объявления, в котором они появляются, но они отлично подходят для объявления объектов и используются чаще.в typedefs и более крупных структурах.
Например, этот подход относительно распространен:
typedef struct { // <-- no tag
char *label;
int value;
} struct_one;
struct_one one[2] = {
{ "one", 1 },
{ "two", 2 }
};
В конце концов, если вы все равно не собираетесь ссылаться на тип через тег, тозачем вводить один в пространство имен тегов?
Я думаю, мне интересно найти стандартную ссылку, чтобы дать Microsoft, если они попытаются сказать мне, что эта ошибка - моя ошибка (хотя я полагаю, что либо ихкомпилятор или отладчик должны быть повреждены, так как код не должен компилироваться / ссылаться или должен правильно отлаживаться, верно?)
Что ж, есть эта часть формальной грамматической спецификации C :
спецификатор структуры или объединения:
идентификатор структуры или объединения опция {список-объявления-структуры}
идентификатор структуры или объединения
Подстрочный индекс opt
указывает, что идентификатор (в данном случае тег) является необязательным в определениях struct
и union
.Это требуется для предварительных объявлений типов struct и union, но это не ваш случай.Из остальной части формальной грамматики следует, что любой struct-or-union-specifier
может использоваться для объявления объекта этого типа или производного от него типа, такого как тип массива.
Более того - и я подозреваю, чтоэто где MS-отладчик падает - нет ограничений на количество структур или типов объединения, объявленных без тега.Быть без тега - это не то же самое, что иметь пустой тег.
В конечном счете, компиляторы (включая Microsoft) принимают его, и я совершенно уверен, что вы найдете даже скомпилированную MSVC версию, которая будет работать так, как ожидается, по модулю ошибки программы.То, что отладчик не понимает типы переменных правильно, определенно является ошибкой в отладчике.
Однако имейте в виду, что Microsoft исторически демонстрировала небольшую склонность предоставлять компилятор C, соответствующий стандартам, так как они никогда не соответствовалилюбая версия языка Си.Чаще всего это синтаксис и функции, которые отличаются от C ++, которые плохо или не поддерживаются MS, так как C ++ всегда был в центре их внимания.