2013-09-06 4 views
8

Возможно ли, что следующий код гарантированно завершится нормально и успешно?У неназванных бит-полей есть четко определенная семантика?

#include <assert.h> 

struct foo_s { 
    union { 
     struct { 
      unsigned a : 10; 
      unsigned : 6; 
     }; 
     struct { 
      unsigned : 10; 
      unsigned b : 6; 
     }; 
     struct { 
      unsigned : 10; 
      unsigned c : 6; 
     }; 
    }; 
}; 

int main() { 
    struct foo_s f; 
    f.a = 0; 
    f.b = 1; 
    assert(f.a == 0); 
    return 0; 
} 

При ответе на другой question, возможность была поднята, что присвоение именованного битового поля в структуре, которая также содержит безымянного битовое поле может вызвать произвольные данные, которые будут записаны в этих битов. С.11 § 6.7.2.1 ¶ 12 гласит:

Декларация битового поля, без описателя, но только двоеточие и ширина, указует безымянного битовое поле.

Мое прочтение этого состоит в том, что неназванное битовое поле является обычным битовым полем, с той лишь разницей, что значение в этих битах невозможно получить напрямую по имени. Реализована ли возможность экстраполяции с использованием логики «как есть» и назначения произвольных данных в этих битах?

+0

Существует очень много правил, связанных с реализацией, для всего, что связано с битовыми полями. Зачем вам нужен шанс? Почему бы просто не создать единую структуру, не содержащую безымянных битовых полей? Конечно, назначается одна часть союза и чтение из другого (и ссылки на '.a' и' .b' являются ссылками на разные (анонимные) члены объединения. –

+0

Содержимое поля Unanamed bit во время работы непредсказуемы, поэтому ** НЕТ ** существует ** нет гарантированного прекращения нормально и успешно **. –

+0

@JonathanLeffler: Обычные причины использования бит-полей основаны на определении интерфейса более высокого уровня на предмет низкого уровня (например, поля в заголовках протоколов) .Это может быть полезно не только в коде, но и при проверке данных в отладчике. Но я хотел бы отложить эту проблему и сосредоточиться на том, хорошо ли определены семантика. – jxh

ответ

5

Да, я думаю, что реализация может записывать произвольные биты в неназванное битовое поле. Я думаю, сноска 126 просто заявляет о своем намерении, почему были введены неназванные битовая ширины больше, чем 0:

Неназванного структура члена битового поля используется для заполнения в соответствовать внешне наложенным макетам.

Таким образом, в основном неназванные битовые поля имеют одинаковую семантику, например, биты заполнения. Вы просто не можете полагаться на их содержание.

Разрешение реализации в основном игнорирует неназванное битовое поле при записи в соседнее именованное битовое поле a значительно облегчает обработку этого поля a. Текущее значение неназванного поля не нужно читать, и запись может выполняться атомарно за один раз. Так же, как для битов дополнения, которые могут содержаться в структуре.

+0

Стандарт кажется очень специфичным в том, где он использует термин * padding bits *, и он никогда не рассматривается в контексте бит- поля. Сноска читается скорее как описание прецедента, а не наложение семантики.Как правило, «внешнее наложение макета» имеет бит «зарезервировано для будущего использования», а зарезервированные биты обычно должны быть всегда 0 (какое-то оборудование проверяет эти биты на проводе), поэтому неназванное битовое поле соответствует макете а также не позволяет программисту случайно использовать эти биты. То, что все идет ka-ka, если компилятор получает заданные здесь случайные значения. – jxh

+0

@jxh, я думаю, что вы больше интерпретируете «внешний макет», чем есть. Это просто говорит о paddidng, а не о зарезервированных битах для будущего использования. Если приложение использует эти биты, и нужно просто убедиться, что они установлены в '0', он должен просто назвать бит-поле. –

+0

Моя основная мысль заключается в том, что термин * неназванное битовое поле * отображается дважды в стандарте (где термин определен и описание использования в сноске). Он никогда не появляется рядом с термином «биты заполнения», а «биты заполнения» никогда не применяются к битовым полям. OTOH, «бит-поля» подробно описаны и с учетом того, как определен термин «неназванное битовое поле», кажется, что все описания «бит-поля» применяются в равной степени к «неназванному битовому полю». – jxh