Справочное руководство по C++ | страница 38



Описание register является описанием auto, которое подсказывает транслятору, что описываемые переменные будут использоваться достаточно интенсивно. Подсказка может быть проигнорирована, и во многих реализациях она игнорируется в том случае, когда берется адрес переменной.

Описание объекта считается определением, если только оно не содержит спецификации extern и инициализации (§R.3.1).

Определение приводит к выделению памяти соответствующего размера и выполнению соответствующей инициализации (§R.8.4).

Спецификации static и extern могут применяться только к именам объектов или функций или к анонимным объединениям. Внутри блока недопустимы описания функций со спецификацией static или формальных параметров со спецификацией static или extern. Статические члены класса описываются в §R.9.4. Спецификация extern недопустима для членов класса.

Имя со спецификацией static подлежит внутреннему связыванию. Объекты, описанные как const, подлежат внутреннему связыванию, если только они не были описаны с внешней связью. Имя со спецификацией extern подлежит внешнему связыванию, если только ранее оно не было описано с внутренней связью. Имя с файловой областью видимости и без спецификации-класса-памяти подлежит внешнему связыванию, если только ранее оно не было описано с внутренней связью или со спецификацией const. В смысле связывания для функций, не являющихся членами, спецификация inline эквивалентна static (§R.3.3). Для одного имени все его спецификации, определяющие связывание, должны быть согласованы. Например,

>static char* f(); // f() имеет внутреннее связывание

>char* f() // f() все еще внутреннее

>{/*… */}

>char* g(); // g() имеет внешнее связывание

>static char* g() // ошибка: противоречие в связывании

>{/*… */}

>static int a; // `a' имеет внутреннее связывание

>int a; // ошибка: второе определение

>static int b; // `b' имеет внутреннее связывание

>extern int b; // `b' все еще внутреннее

>int c; // `c' имеет внешнее связывание

>static int c; // ошибка: противоречие в связывании

>extern int d; // `d' имеет внешнее связывание

>static int d; // ошибка: противоречие в связывании

Имя неопределенного класса можно использовать в описании extern. Однако, такое описание нельзя использовать прежде, чем класс будет определен, например,

>struct S;

>extern S a;

>extern S f();

>extern void g(S);

>void h()

>{

> g(a); // ошибка: S неопределено

> f(); // ошибка: S неопределено

>}

R.7.1.2 Спецификации функций

Некоторые спецификации можно использовать только в описании функций.