Новым является правило, согласно которому вычислять адрес объекта класса register нельзя, а класса auto можно.
Спецификатор static дает объявляемым объектам класс статической памяти, он может использоваться и внутри, и вне функций. Внутри функции этот спецификатор вызывает выделение памяти и служит определением; его роль вне функций будет объяснена в A11.2.
Объявление со спецификатором extern , используемое внутри функции, объявляет, что для объявляемого объекта где-то выделена память; о ее роли вне функций будет сказано в A11.2.
Спецификатор typedef не резервирует никакой памяти и назван спецификатором класса памяти из соображений стандартности синтаксиса; речь об этом спецификаторе пойдет в A8.9.
Объявление может содержать не более одного спецификатора класса памяти. Если он в объявлении отсутствует, то действуют следующие правила: считается, что объекты, объявляемые внутри функций, имеют класс auto ; функции, объявляемые внутри функций, - класс extern ; объекты и функции, объявляемые вне функций, - статические и имеют внешние связи (см. A10, A11).
Спецификаторы типа определяются следующим образом:
спецификатор-типа :
void
char
short
int
long
float
double
signed
unsigned
структуры-или-объединения-спецификатор
спецификатор-перечисления
typedef-имя
Вместе с int допускается использование еще какого-то одного слова - long или short ; причем сочетание long int имеет тот же смысл, что и просто long : аналогично short int - то же самое, что и short . Слово long может употребляться вместе с double . С int и другими его модификациями ( short , long или char ) разрешается употреблять одно из слов signed или unsigned . Любое из последних может использоваться самостоятельно, в этом случае подразумевается int .
Спецификатор signed бывает полезен, когда требуется обеспечить, чтобы объекты типа char имели знак; его можно применять и к другим целочисленным типам, но в этих случаях он избыточен.
За исключением описанных выше случаев объявление не может содержать более одного спецификатора типа. Если в объявлении нет ни одного спецификатора типа, то имеется в виду тип int .
Для указания особых свойств объявляемых объектов предназначаются квалификаторы:
квалификатор-типа :
const
volatile
Квалификаторы типа могут употребляться с любым спецификатором типа. Разрешается инициализировать const -объект, однако присваивать ему что-либо в дальнейшем запрещается. Смысл квалификатора volatile зависит от реализации.
Средства const и volatile (изменчивый) введены стандартом ANSI. Квалификатор const применяется, чтобы разместить объекты в памяти, открытой только на чтение (ПЗУ), или чтобы способствовать возможной оптимизации. Назначение квалификатора volatile - подавить оптимизацию, которая без этого указания могла бы быть проведена. Например, в машинах, где адреса регистров ввода-вывода отображены на адресное пространство памяти, указатель на регистр некоторого устройства мог бы быть объявлен как volatile , чтобы запретить компилятору экономить очевидно избыточную ссылку через указатель. Компилятор может игнорировать указанные квалификаторы, однако обязан сигнализировать о явных попытках изменить значение const -объектов.
A8.3. Объявления структур и объединений
Структура - это объект, состоящий из последовательности именованных элементов различных типов. Объединение - объект, который в каждый момент времени содержит один из нескольких элементов различных типов. Объявления структур и объединений имеют один и тот же вид.
спецификатор структуры-или-объединения :
структуры-или-объединения идентификатор необ { список-объявлений-структуры }
структуры-или-объединения идентификатор
структура-или-объединение :
struct
union
Список-объявлений-структуры является последовательностью объявлений элементов структуры или объединения:
список-объявлений-структуры :
объявление-структуры
список-объявлений-структуры объявление-структуры
объявление-структуры :
список-спецификаторов-квалификаторов список-структуры-объявителей ;
Читать дальше