Чтение онлайн

на главную

Жанры

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

Страустрап Бьярн

Шрифт:

int a;

extern const c = 1;

int f(int x) { return x+a; }

struct S { int a; int b; };

enum { up, down };

тогда как ниже следуют только описания:

extern int a;

extern const c;

int f(int);

struct S;

typedef int Int;

Для каждого объекта, функции, класса и элемента перечисления, используемых в программе, должно быть только одно определение (§R.3.3). Если функция никогда не вызывается и ее адрес никогда не используется,

ее не нужно определять. Аналогично, если имя класса используется только так, что не требуется знать определения класса, то такой класс не надо определять.

R.3.2 Область видимости

Существует четыре области видимости: локальная, функция, файл и класс.

Локальная: Имя, описанное в блоке (§R.6.3), является локальным в этом блоке и может использоваться только в нем и в блоках, содержащихся в этом блоке и появляющихся после момента описания. Имена формальных параметров рассматриваются, как если бы они были описаны в самом объемлющем блоке этой функции.

Функция: Метки (§R.6.1) можно использовать повсюду в функции, в которой они описаны. Только метки имеют область видимости, совпадающую с функцией.

Файл: Имя описанное вне всех блоков (§R.6.3) и классов (§R.9) имеет область видимости файл и может быть использовано в единице трансляции, в которой оно появляется после момента описания. Имена, описанные с файловой областью видимости, называются глобальными.

Класс: Имя члена класса является локальным в своем классе и оно может быть использовано только в функции-члене этого класса (§R.9.3), или после операции., применяемой к объекту данного класса (§R.5.2.4) или объекту производного класса(§R.10), или после операции -›, применяемой к указателю на объект данного класса (§R.5.2.4) или на объект производного класса, или после операции разрешения:: (§R.5.1), примененной к имени данного или производного класса. Имя, введенное с помощью операции friend (§R.11.4), принадлежит той же области определенности, что и класс, содержащий описание friend. Класс, впервые описанный в операторе return или в типе параметра, принадлежит к глобальной области видимости.

Специальные соглашения действуют на имена, введенные при описании параметров функции (§R.8.2.5) и в описаниях friend (§R.11.4).

Имя может быть скрыто явным описанием того же имени в объемлющем блоке или классе. Скрытое имя члена класса все-таки можно использовать, если оно предваряется именем класса, к которому применена операция:: (§R.4.1, §R.9.4, §R.10). Скрытое имя объекта, функции, типа или элемента перечисления с файловой областью видимости можно использовать, если оно предваряется унарной операцией :: (§R.5.1). В дополнении к этому, имя класса (§R.9.1) может быть скрыто именем объекта, функции или элемента перечисления, имеющего ту же область видимости. Если класс и объект, или функция, или элемент перечисления описаны (в любом порядке) с одинаковым именем в одной области видимости, то имя класса становится скрытым. Имя класса, скрытое в локальной области видимости или в области видимости класса именем объекта, функции или элемента перечисления, все-таки можно использовать, если предварить его подходящей спецификацией class, struct или union (§R.7.1.6). Аналогично, скрытое имя элемента перечисления можно использовать, если предварить его спецификацией типа enum (§R.7.1.6). В §R.10.4 приводится сводка правил области видимости. Моментом описания имени считается момент завершения описателя имени (§R.8), предшествующей части инициализации (если она есть).

Например,

int x = 12;

{ int x = x; }

Здесь второе x инициализируется своим собственным (неопределенным) значением.

Моментом описания элемента перечисления считается момент сразу после появления его идентификатора, например:

enum { x = x };

Здесь элемент перечисления x опять инициализируется своим собственным (неопределенным) значением.

R.3.3 Программа и связывание

Программа

состоит из одного или нескольких файлов, связываемых вместе (§R.2). Файл состоит из последовательности описаний.

Имя с файловой областью видимости, которое явно описано как static, является локальным в своей единице трансляции и может использоваться для именования объектов, функций и т.п. в других единицах трансляции. Говорят, что такие имена имеют внутреннее связывание. Имя с файловой областью видимости, которое явно описано со спецификацией inline, является локальным в своей единице трансляции. Имя с файловой областью видимости, которое явно описано со спецификацией const и не описано явно как extern, считается локальным в своей единице трансляции. То же верно для имени класса, которое не использовалось в нелокальных для данной единицы трансляции описаниях объекта, функции или класса, и который не имеет статических членов (§R.9.4), не имеет функций-членов, кроме подстановок (§R.9.3.2). Всякое описание некоторого имени с файловой областью видимости, которое не описано одним из перечисленных способов так, чтобы иметь внутреннее связывание, в многофайловой программе обозначает один и тот же объект (§R.3.7), функцию (§R.8.2.5) или класс (§R.9). Такие имена называются внешними или говорят, что они имеют внешнее связывание. В частности, поскольку нельзя описать имя класса как static, всякое употребление имени некоторого класса с файловой областью видимости, который (класс) использовался для описания объекта или функции с внешним связыванием, или же который имеет статический член или функцию-член, не являющуюся подстановкой, будет обозначать один и тот же класс.

Имена определяемых типов (typedef §R.7.13), элементы перечисления (§R.7.2) или имена шаблонов типа (§R.14) не имеют внешнего связывания.

Статические члены класса (§R.9.4) допускают внешнее связывание.

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

Локальные имена (§R.3.2), явно описанные со спецификацией extern, имеют внешнее связывание, если только они уже не были описаны как static (§R.7.1.1).

Типы, используемые во всех описаниях некоторого внешнего имени, должны совпадать, за исключением использования имен определяемых типов (§R.7.1.3) и указания границ массивов (§R.8.2.4). Должно быть в точности одно определение для каждой функции, объекта, класса и элемента перечисления, используемых в программе. Однако, если функция никогда не вызывается и ее адрес никогда не используется, ее не нужно определять. Аналогично, если имя класса используется только таким образом, что не требуется знать определение класса, то класс не нужно определять.

Область видимости функции может быть только файл или класс.

С помощью спецификации связывания можно добиться связывания с описаниями на другом языке (§R.7.4).

R.3.4 Начало и окончание программы

Программа должна содержать функцию с именем main. Ей приписывается роль начала программы. Эта функция не является предопределенной для транслятора, она не может быть перегружена, а ее тип зависит от реализации. Предполагается, что любая реализация должна допускать два приведенных ниже определения и что можно добавлять после argv любые параметры. Функция main может определяться так

int main {/*… */}

или

int main(int argc, char* argv[]) {/*… */}

В последнем определении argc задает число параметров, передаваемых программе окружением, в котором она выполняется. Если argc не равно нулю, параметры должны передаваться как строки, завершающиеся символом '\0', с помощью argv[0] до argv[argc-1], причем argv[0] должно быть именем, под которым программа была запущена, или "". Должно гарантироваться, что argv[argc]==0.

Функция main не должна вызываться в программе. Связывание main (§R.3.3) зависит от реализации. Нельзя получать адрес main и не следует описывать ее как inline или static.

Поделиться:
Популярные книги

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10

Кодекс Охотника. Книга IX

Винокуров Юрий
9. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга IX

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Физрук: назад в СССР

Гуров Валерий Александрович
1. Физрук
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Физрук: назад в СССР

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Энфис 5

Кронос Александр
5. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 5

Хочу тебя навсегда

Джокер Ольга
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Хочу тебя навсегда

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Волк 5: Лихие 90-е

Киров Никита
5. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 5: Лихие 90-е

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.20
рейтинг книги
Ученик

Не грози Дубровскому! Том IX

Панарин Антон
9. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том IX