Анонимные структуры в C - PullRequest
0 голосов
/ 10 мая 2019

Мы работаем с Visual Studio 2019 в Windows 10 Pro (x64) на старом, родном языке C. Вчера мы работали над небольшой одноразовой программой для тестирования канала связи и обнаружили, что приведенный ниже код компилируется и запускается. но смущает отладчик VS2019:

#include <Windows.h>
#include <stdio.h>
#include <string.h>

struct
{
   char *label;
   int   value;
} one[2] =
{
   { "one", 1 },
   { "two", 2 },
};

struct
{
   int   prox;
   DWORD fuse;
   float debug;
} two[6];

int main( int argc, char **argv )
{
   DebugBreak();
   return 0;
}

Когда в точке останова (жестко запрограммированной в примере, который мы дали Microsoft), отладчик будет показывать неправильные имена и значения переменных-членов для одной из двух анонимных структур в подсказках, которые показывают значение переменной и окно просмотра с переменные указаны.

Мой вопрос: кроме того, что это плохая практика кодирования, есть ли причина, по которой этот код неправильный (строго в смысле компилятора C)?

Я думаю, мне интересно найти стандартную ссылку, чтобы дать Microsoft, если они попытаются сказать мне, что эта ошибка - моя ошибка (хотя я считаю, что их компилятор или отладчик должны быть повреждены, так как код не должен компилироваться / ссылка или должна правильно отлаживаться, верно?)

1 Ответ

1 голос
/ 10 мая 2019

Мой вопрос: кроме того, что это плохая практика кодирования, есть ли какая-то причина, почему этот код неправильный (строго в смысле компилятора 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 ++ всегда был в центре их внимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...