C инициализация структуры с помощью маркировок. Это работает, но как?

Нет никакого полного, опубликованного синтаксиса для Дельфи. Примите во внимание, что .net и win32 delphi имеют различные синтаксисы.

Этот проект имеет ручную сборку синтаксический анализатор Дельфи в нем. И много тестовых сценариев кода, который компилирует, но раздвигает границы синтаксиса.

41
задан Mogsdad 16 January 2018 в 19:18
поделиться

5 ответов

Вот раздел руководства gcc, в котором объясняется синтаксис назначенных инициализаторов для структур и массивов:

В инициализаторе структуры укажите имя поля для инициализации с ' .fieldname = ' перед значением элемента. Например, учитывая следующая структура,

  struct point {int x, y; };

следующая инициализация

  struct point p = {.y = yvalue, .x = xvalue}; 

эквивалентно

  struct point p = {xvalue, yvalue}; 

Another syntax which has the same meaning, obsolete since GCC 2.5, is 'fieldname:', as shown here:

 struct point p = { y: yvalue, x: xvalue };

The relevant page can be found here.

Your compiler should have similar documentation.

39
ответ дан 27 November 2019 в 00:25
поделиться

Yes, as pointed out above, these are designated initializers, which are standard C, though you should switch to using periods instead of colons. And as you note, most of the books out there are still stuck somewhere around 1984 in their syntax and fail to mention them. More fun facts:

--When using designated initializers, everything not specified is initialized at zero. This helps with exceptionally large structs, e.g.:

typedef struct {
   double a, b, c, d, e;
   char label[100];
} too_many_type;

too_many_type tm = {.a = 1, .e = 2, .b=1.5};
assert(tm.a + tm.b + tm.c + tm.d + tm.e == 4.5);
assert(!strlen(label));

--Also, you can use the compound literal form to use this form on a non-initialization line, e.g.:

too_many_type tm2;
tm2 = (too_many_type) {.a = 3, .e=6};

These are really great features, and are supported by every C compiler that I can think of, being that it's the standard. It's a shame that they're not so well known.

12
ответ дан 27 November 2019 в 00:25
поделиться

На самом деле это не «помеченные операторы», а способ дать начальные значения именованным полям в структуре.

Gcc выдает предупреждение об «устаревшем использовании назначенного инициализатора с ': '", а в C99 вы должны вместо этого написать:

    TEST_STRUCT test = {
        .second = 2,
        .first =  1
    };
5
ответ дан 27 November 2019 в 00:25
поделиться

Это ни метки, ни битовые поля.

Это синтаксис для инициализации элементов структуры, относящийся ко временам до C99. Он не стандартизован, но доступен, например, в gcc.

typedef struct { int y; int x; } POINT;
POINT p = { x: 1, y: 17 };

В C99 синтаксис для инициализации определенных элементов структуры был впервые представлен в стандарте, но выглядит немного иначе:

typedef struct { int y; int x; } POINT;
POINT p = { .x = 1, .y = 17 };
33
ответ дан 27 November 2019 в 00:25
поделиться

Этот синтаксис не определен стандартом C. Раздел 6.7.8 Инициализация говорит

         designation:
                designator-list =
         designator-list:
                designator
                designator-list designator
         designator:
                [ constant-expression ]
                . identifier

Если ваш компилятор принимает обозначение с двоеточием без диагностического сообщения, это означает, что ваш компилятор не соответствует (или настроен так, чтобы не соответствовать) стандартам.

3
ответ дан 27 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: