Нет никакого полного, опубликованного синтаксиса для Дельфи. Примите во внимание, что .net и win32 delphi имеют различные синтаксисы.
Этот проект имеет ручную сборку синтаксический анализатор Дельфи в нем. И много тестовых сценариев кода, который компилирует, но раздвигает границы синтаксиса.
Вот раздел руководства 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.
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.
На самом деле это не «помеченные операторы», а способ дать начальные значения именованным полям в структуре.
Gcc выдает предупреждение об «устаревшем использовании назначенного инициализатора с ': '", а в C99 вы должны вместо этого написать:
TEST_STRUCT test = {
.second = 2,
.first = 1
};
Это ни метки, ни битовые поля.
Это синтаксис для инициализации элементов структуры, относящийся ко временам до 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 };
Этот синтаксис не определен стандартом C. Раздел 6.7.8 Инициализация
говорит
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
. identifier
Если ваш компилятор принимает обозначение с двоеточием без диагностического сообщения, это означает, что ваш компилятор не соответствует (или настроен так, чтобы не соответствовать) стандартам.