4.2 Компоновка

4.2 Компоновка

Если не указано иное, то имя, не являющееся локальным для функции или класса, в каждой части программы, компилирумой отдельно, должно относиться к одному и тому же типу, знчению, функции или объекту. То есть, в программе может быть только один нелокальный тип, значение, функция или объект с этим именем. Рассмотрим, например, два файла:

// file1.c: int a = 1; int f() (* /* что-то делает */ *)

// file2.c: extern int a; int f(); void g() (* a = f(); *)

a и f(), используемые g() в файле file2.c,– те же, что определены в файле file1.c. Ключевое слово extern (внешнее) указывает, что описание a в file2.c является (только) описнием, а не определением. Если бы a инициализировалось, extern было бы просто проигнорировано, поскольку описание с иницилизацией всегда является определением. Объект в программе должен определяться только один раз. Описываться он может много раз, но типы должны точно согласовываться. Например:

// file1.c: int a = 1; int b = 1; extern int c;

// file2.c: int a; extern double b; extern int c;

Здесь три ошибки: a определено дважды (int a; является определением, которое означает int a=0;), b описано дважды с разными типами, а c описано дважды, но не определено. Эти вды ошибок не могут быть обнаружены компилятором, который за один раз видит только один файл. Компоновщик, однако, их онаруживает.

Следующая программа не является С++ программой (хотя C программой является):

// file1.c: int a; int f() (* return a; *)

// file2.c: int a; int g() (* return f(); *)

Во-первых, file2.c не С++, потому что f() не была описана, и поэтому компилятор будет недоволен. Во-вторых, (когда file2.c фиксирован) программа не будет скомпонована, посколку a определено дважды.

Имя можно сделать локальным в файле, описав его static. Например:

// file1.c: static int a = 6; static int f() (* /* ... */ *)

// file2.c: static int a = 7; static int f() (* /* ... */ *)

Поскольку каждое a и f описано как static, получающаяся в результате программа является правильной. В каждом файле своя a и своя f().

Когда переменные и функции явно описаны как static, часть программы легче понять (вам не надо никуда больше залядывать). Использование static для функций может, помимо этого, выгодно влиять на расходы по вызову функции, поскольку дает оптимизирующему компилятору более простую работу.

Рассмотрим два файла:

// file1.c: const int a = 6; inline int f() (* /* ... */ *) struct s (* int a,b; *)

// file1.c: const int a = 7; inline int f() (* /* ... */ *) struct s (* int a,b; *)

Раз правило «ровно одно определение» применяется к контантам, inline-функциям и определениям функций так же, как оно применяется к функциям и переменным, то file1.c и file2.c не могут быть частями одной С++ программы. Но если это так, то как же два файла могут использовать одни и те же типы и константы? Коротко, ответ таков: типы, константы и т.п. могут определяться столько раз, сколько нужно, при условии, что они определяются одинаково. Полный ответ несколько более сложен (это объясняется в следующем разделе).

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

2. Компоновка пакета инфопродуктов

Из книги автора

2. Компоновка пакета инфопродуктов Создайте для распродажи пакет тренингов. Мы не рекомендуем делать распродажу на каждый продукт – так заработаете меньше денег. Лучше объединить все продукты в пакет. Например, каждый продукт стоит 3000 рублей, у вас их четыре, и суммарно


Динамическая компоновка и С++

Из книги автора

Динамическая компоновка и С++ Один из путей решения этих проблем – упаковка класса FastString в динамически подключаемую библиотеку (Dynamic Link Library – DLL). Это может быть сделано несколькими способами. Простейший из них – использовать директиву компилятора, действующую на уровне


Компоновка виджетов

Из книги автора

Компоновка виджетов В данном разделе мы создадим небольшое приложение, которое демонстрирует применение менеджеров компоновки для размещения виджетов в окне и использование сигналов и слотов для синхронизации работы двух виджетов. Приложение предлагает пользователю


Компоновка виджетов на форме

Из книги автора

Компоновка виджетов на форме Существует три основных способа управления компоновкой дочерних виджетов формы: абсолютное позиционирование, ручная компоновка и применение менеджеров компоновки. Мы рассмотрим по очереди каждый из этих методов, используя в качестве


Стековая компоновка

Из книги автора

Стековая компоновка Класс QStackedLayout (менеджер стековой компоновки) управляет компоновкой набора дочерних виджетов или «страниц», показывая в каждый конкретный момент только одну из них и скрывая от пользователя остальные. Сам менеджер QStackedLayout невидим и не содержит


Компоновка C#-приложений с помощью csc.exe

Из книги автора

Компоновка C#-приложений с помощью csc.exe Теперь, когда машина распознает csc.exe, с помощью компилятора командной строки C# и программы Блокнот мы построим простой одномодульный компоновочный блок, который назовем TestApp.exe. Для начала нам нужен исходный код. Откройте программу


Компоновка .NET-приложений с помощью TextPad

Из книги автора

Компоновка .NET-приложений с помощью TextPad Бесплатный редактор Блокнот, несомненно, подходит для создания простых программ .NET, но он не может ничего предложить для повышения производительности труда разработчика. Хорошо, когда редактор, с помощью которого создаются файлы


1.2.2. Компоновка объектных файлов

Из книги автора

1.2.2. Компоновка объектных файлов После того как файлы main.c и reciprocal.cpp скомпилированы, необходимо скомпоновать их. Если в проект входит хотя бы один файл C++, компоновка всегда осуществляется с помощью компилятора g++. Если же все файлы написаны на языке С, нужно использовать


Глава 15 Пространство и компоновка чертежа

Из книги автора

Глава 15 Пространство и компоновка чертежа Формирование в AutoCAD модели объекта, в том числе трехмерной, обычно не является самоцелью. Это делается для дальнейшего использования такой модели в системах прочностных расчетов и кинематического моделирования, при получении


4.3 Компоновка

Из книги автора

4.3 Компоновка Имя в файловой области видимости, не описанное явно как static, является общим для каждого файла многофайловой прораммы. Таковым же является имя функции. О таких именах говорится, что они внешние. Каждое описание внешнего имени в программе относится к тому же


Компоновка системы

Из книги автора

Компоновка системы Как практически реализовать процесс компоновки системы?Допустим, что операционная система использует обычный способ хранения исходных текстов классов в файлах. Инструментальному средству компоновки (компилятор, интерпретатор) необходима следующая


Компоновка кадра

Из книги автора

Компоновка кадра Компоновать снимок надо так, чтобы максимально скрыть антураж зоопарка, оставив за границами кадра все лишнее.Изобилия пустого пространства тоже быть не должно — лучше взять животное крупным планом. В то же время по линии взгляда объекта надо оставить


Компоновка кадра

Из книги автора

Компоновка кадра Нередко пейзаж приходится обрабатывать на компьютере – обрезать лишнее, кадрировать чтобы придать ему более привлекательный вид, что-то добавлять с помощью фотомонтажа и т. д.Пейзаж, который сфотографирован вдумчиво, грамотно, не придется исправлять,