Спецификации класса памяти могут быть такие: спецификация-класса-памяти: auto register static extern Спецификации auto и register могут применяться только дляимен объектов, которые описаны в блоке ($$R.6.3), или для формальныхпараметров ($$R.8.3). Почти всегда спецификация auto избыточна ииспользуется не часто, так, auto используется, чтобы явно отделитьоператор-описание от оператора-выражения ($$R.6.2). Описание 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 неопределено }