Оператор typedef можно использовать и для именованной структуры, если согласно логике программы в этом есть какой-то смысл.
Внутри скобок для объявления членов структуры используется стандартный синтаксис для объявления соответствующих типов. При этом структура не может иметь в качестве своего члена объект того же типа, что и сама структура, но указатель на такой объект может быть членом структуры. Членом структуры в C++ может быть функция.
Битовые поля структур Битовые поля это определенное количество именованных или не именованных битов, которое является членом структуры (объединения, класса). Объявляется битовое поле следующим образом:type-specifier
В С++ спецификатором типа может быть любое беззнаковое целое.
Объявив битовое поле в структуре, к нему можно обращаться, как к любому другому члену структуры, пользуясь операторами доступа «точка» и «стрелка».
Пользуясь битовыми полями, необходимо учитывать несколько факторов, которые перечислены в следующем списке.
? Код, содержащий битовые поля, не всегда можно перенести на другие платформы, поскольку организация битов в байте и байтов в слове может быть разной в отдельных архитектурах.
? Доступ к битовому полю х при помощи выражения вроде mystruct.x корректен, а получение адреса & mystruct.x невозможно в принципе, поскольку mystruct.x не хранится в байте.
? Битовые поля принимаются для того, чтобы упаковать данные так, чтобы они занимали меньше места. Но для работы с битовыми полями компилятор генерирует дополнительный код, что приводит не только к увеличению размера, но и к замедлению работы программы.
В следующем примере будет объявлена структура, членами которой являются указатель на эту структуру, функция и битовое поле.
Упражнение 4.1 (продолжение)
21. Добавить новый блок в основную рабочую последовательность, код которого приведен в листинге 4.12.
Листинг 4.12//Блок 18
void f6(){
mm[0] = \0;
struct mystruct {
int d;
double e;
unsigned short mybit: 2;
mystruct* s;
int myfunc(int g)
{return g*g;};} mystr;
mystruct* pmy = &mystr
mystr.s = pmy;
mystr.d = 100;
pmy->e = 300.00;
mystr.mybit = 3;
sprintf(nn,"%f", pmy->e);
strcat(mm, nn);
strcat(mm, « – pmy->e\n»);
sprintf(nn,"%d", mystr.d);
strcat(mm, nn);
strcat(mm, « – mystr.d\n»);
sprintf(nn,"%p", mystr.s);
strcat(mm, nn);
strcat(mm, « – mystr.s\n»);
sprintf(nn,"%d", mystr.myfunc(12));
strcat(mm, nn);
strcat(mm, « – mystr.myfunc(12)\n»);
sprintf(nn,"%d", pmy->myfunc(12));
strcat(mm, nn);
strcat(mm, « – pmy->myfunc(12)\n»);
sprintf(nn,"%d", mystr.mybit);
strcat(mm, nn);
strcat(mm, « – mystr.mybit\n»);
mbstowcs(mstr, mm, 256);
szStr = mstr;
}