Описания используются для определения интерпретации, даваемой каждому идентификатору; они не обязательно резервируют память, связанную с идентификатором. Описания имеют вид:
описание: спецификаторы_описания opt список_описателей opt ; описание_имени asm_описание
Описатели в списке_описателей содержат идентификаторы, подлежащие описанию. Спецификаторы_описания могут быть опущены только в определениях внешних функций (см. тут) или в описаниях внешних функций. Список описателей может быть пустым только при описании класса (cм. этот пункт) или перечисления (см. этот пункт), то есть, когда спецификаторы_описания - это class_спецификатор или enum_спецификатор. Описания имен описываются здесь; описания asm описаны в здесь.
спецификатор_описания: sc_спецификатор спецификатор_типа фнк_спецификатор friend typedef
спецификаторы_описания: спецификатор_описания спецификатор_описания opt
Список должен быть внутренне непротиворечив в описываемом ниже смысле.
Спецификаторы класса памяти
Спецификаторы "класса памяти" (sc-спецификатор) это:
sc-спецификатор: auto static extern register
Описания, использующие спецификаторы auto, static и register также служат определениями тем, что они вызывают резервирование соответствующего объема памяти. Если описание extern не является определением (этот пункт), то где-то еще должно быть определение для данных идентификаторов.
Описание register лучше всего представить как описание auto (автоматический) с подсказкой компилятору, что описанные переменные усиленно используются. Подсказка может быть проигнорирована. К ним не может применяться операция получения адреса &.
Спецификаторы auto или register могут применяться только к именам, описанным в блоке, или к формальным параметрам. Внутри блока не может быть описаний ни статических функций, ни статических формальных параметров.
В описании может быть задан максимум один sc_спецификатор. Если в описании отсутсвует sc_спецификатор, то класс памяти принимается автоматическим внутри функции и статическим вне. Исключение: функции не могут быть автоматическими.
Спецификаторы static и extern могут использоваться только для имен объектов и функций.
Некоторые спецификаторы могут использоваться только в описаниях функций:
фнк-спецификатор: overload inline virtual
Спецификатор перегрузки overload делает возможным использование одного имени для обозначения нескольких функций; см. этот пункт.
Спецификатор inline является только подсказкой компилятору, не влияет на смысл программы и может быть проигнорирован. Он используется, чтобы указать на то, что при вызове функции inline- подстановка тела функции предпочтительнее обычной реализации вызова функции. Функция (этот пункт и этот пункт), определенная внутри описания класса, является inline по умолчанию.
Спецификатор virtual может использоваться только в описаниях членов класса; см. этот пункт.
Спецификатор friend используется для отмены правил скрытия имени для членов класса и может использоваться только внутри описаний классов; см. этот пункт.
С помощью спецификатора typedef вводится имя для типа; см. этот пункт.
1 2 3 4 5 6
8 8 8
|