Подтвердить что ты не робот

Является ли первое поле структуры C всегда гарантированным при смещении 0?

Что касается языка программирования C...

Часть вопроса в C/С++ Structure offset утверждает, что "& не всегда указывает на первый байт первого поля структуры"

Но, смотря на "Обоснование ANSI" на http://www.lysator.liu.se/c/rat/c5.html, говорится, что "в начале нет никакого отверстия" в разделе 3.5. 2.1. Спецификации структуры и союза. Поэтому я не уверен, является ли "Обоснование" окончательным, но, похоже, это противоречит той части этого очень заметного вопроса.

Итак, что это? Является ли первое поле структуры C всегда гарантированным при смещении 0?

struct A
{
    int x;
};

struct B
{
    struct A myA;
    int y;
};

B myB;

Возможно ли &myB быть таким же, как &(myB.myA), переносимым образом?

(Более конкретно, трюк пользовательских данных libev в Libev, как передать аргументы соответствующим обратным вызовам и во многих других местах, предполагает, что первое поле в структуре при смещении 0... это действительно портативно?)

4b9b3361

Ответ 1

Из стандартного раздела C99 6.7.2.1 пункт 13:

Внутри объекта структуры небитовые поля и единицы, в которых бит-поля имеют адреса, которые увеличиваются в том порядке, в котором они объявлены. Указатель на структурный объект, соответствующим образом преобразованный, указывает на его первоначальный член (или если этот элемент является бит-поле, затем в блок, в котором он находится) и наоборот. Может быть неназванный заполнение внутри объекта структуры, но не в начале.

Поэтому ответ на ваш вопрос да.