К этому моменту мы рассмотрели большую часть инфраструктуры, теперь я хотел бы поговорить о возможностях расширения типов в C.

typedef — это ключевое слово, которое позволяет вам сообщить компилятору, что у вас есть новый тип, который вы хотите, чтобы он распознал. Это может иметь ряд применений. Вы можете использовать его для переназначения базовых типов, возможно, для помощи в кросс-платформенной работе вплоть до определения ваших собственных типов для конкретных приложений.

тип int INTEGER

ЦЕЛОЕ ЧИСЛО х = 0

В приведенном выше примере создается тип с именем INTEGER, который затем можно использовать в коде. Как упоминалось в кроссплатформенной разработке, это удобно в сочетании с условной компиляцией препроцессора.

#ifdef ОС

typedef int OS_SPECIFIC_INT

#endif

Очевидно, что это поможет внести ясность и упростить написание программы, так что вам не придется вносить массу изменений при компиляции для другой платформы.

Я думаю, что наибольшая сила приходит с вашими собственными типами. Чтобы обсудить это, мы сначала должны поговорить о типе, встроенном в язык, который называется struct.

Если вы лучше знакомы с объектно-ориентированными языками, вам следует рассматривать struct как класс. Только есть несколько отличий. Есть переменные-члены, но нет (встроенной) поддержки функций-членов в struct. Вы можете обойти это с помощью указателей функций, к которым мы вернемся в будущем, а пока думайте об этом как о классе, все члены которого по умолчанию общедоступны. На самом деле, это основное различие между struct C и классом C++. В классах C++ все члены являются закрытыми по умолчанию, а в structs C все члены являются общедоступными.

структура аккаунта {

баланс;

общая сумма;

};

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

структура учетной записи new_account;

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

новый_аккаунт.баланс = 0;

Существует ярлык, который вы можете использовать для определения типа и одновременного создания переменных.

структура аккаунта {

баланс;

общая сумма;

} новый аккаунт;

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

структура аккаунта {

баланс;

общая сумма;

} ;

typedef struct account account_t;

Теперь вы можете просто ввести account_t new_account, чтобы получить переменную struct. Как только вы разберетесь в этом, вы сможете увидеть во всех местах, где это полезно.

Последнее, что я скажу о структурах. Их также можно использовать для определения битовых полей. Которого я никогда не знал в течение долгого времени, и когда я узнал об этом, это была самая умопомрачительная, удивительная вещь, которую я когда-либо находил в языке. Такая простая вещь, но чувак, я долго делал это неправильно.

Заключение

Ну вот и все. Теперь у вас есть контейнер, в котором может храниться много разных вещей, например примитивный объект. Вы можете видеть, где это было бы полезно в программах. Мы также говорили о том, как переопределить типы, чтобы они имели больше смысла в вашем приложении и способствовали переносимости ваших приложений. Теперь я чувствую, что мы рассмотрели большинство типов достаточно хорошо, чтобы теперь мы могли поговорить о том, как хранить многие из них. Массивы распространены во всех языках, поэтому этот следующий фрагмент должен быть лишь небольшим охватом очень распространенной темы.

Ссылки

Здесь вы найдете книги, которые я считаю действительно полезными и к которым я возвращаюсь снова и снова, когда мне нужен авторитет в языке.

Язык программирования C — это справочник, написанный создателями языка, должен быть на полке.

Deep C Secrets — отличная книга, в которой рассказывается о множестве трюков, которые этот язык позволит вам выполнить.