Spec-Zone.ru › GCC 15

8.4 Директивы интерфейса и реализации C++

#pragma interface и #pragma implementation предоставляют пользователю возможность явно указать компилятору генерировать сущности с расплывчатой привязкой (и отладочную информацию) в определённой единице трансляции.

Примечание: Начиная с GCC 2.7.2 эти #pragma-директивы были заменены поддержкой COMDAT и эвристикой «ключевого метода», упомянутой в разделе Расплывчатая привязка. Их использование может привести к увеличению размера программы из-за ненужных внестрочных копий встроенных функций.

#pragma interface
#pragma interface "subdir/objects.h"

Используйте эту директиву в заголовочных файлах, определяющих классы объектов, чтобы сэкономить место в большинстве объектных файлов, использующих эти классы. Обычно в каждом объектном файле, содержащем определения классов, необходимо хранить локальные копии некоторой информации (резервные копии встроенных функций-членов, отладочную информацию и внутренние таблицы, реализующие виртуальные функции). Эту директиву можно использовать, чтобы избежать такого дублирования. Когда при компиляции включается заголовочный файл, содержащий «#pragma interface», эта вспомогательная информация не генерируется (если только сам основной входной файл исходного кода не использует «#pragma implementation»). Вместо этого объектные файлы содержат ссылки, которые разрешаются во время компоновки.

Вторая форма этой директивы полезна, если у вас есть несколько заголовочных файлов с одинаковыми именами в разных каталогах. Если вы используете эту форму, необходимо указать ту же строку в «#pragma implementation».

#pragma implementation
#pragma implementation "objects.h"

Используйте эту директиву в основном входном файле, если необходимо сгенерировать полный вывод для включённых заголовочных файлов (и сделать его глобально видимым). В свою очередь, включённый заголовочный файл должен использовать «#pragma interface». Резервные копии встроенных функций-членов, отладочная информация и внутренние таблицы, используемые для реализации виртуальных функций, генерируются в файлах реализации.

Если использовать «#pragma implementation» без аргумента, директива применяется к включаемому файлу с тем же базовым именем7, что и у исходного файла. Например, в файле allclass.cc простая запись «#pragma implementation» эквивалентна записи «#pragma implementation "allclass.h"».

Используйте строковый аргумент, если хотите, чтобы один файл реализации включал код из нескольких заголовочных файлов. (Также необходимо использовать «#include», чтобы включить заголовочный файл; «#pragma implementation» лишь указывает, как использовать файл, — фактически он не включает его.)

Разделить содержимое одного заголовочного файла между несколькими файлами реализации невозможно.

«#pragma implementation» и «#pragma interface» также влияют на встраивание функций.

Если определить класс в заголовочном файле, отмеченном директивой «#pragma interface», влияние на встроенную функцию, определённую в этом классе, будет аналогично явному объявлению extern — компилятор вообще не генерирует код для определения независимой версии функции. Её определение используется только для встраивания в вызывающий код.

И наоборот, если включить тот же заголовочный файл в основной исходный файл, где он объявлен директивой «#pragma implementation», компилятор генерирует код самой функции; таким образом определяется версия функции, доступная через указатели (или вызываемая из кода, скомпилированного без встраивания). Если все вызовы функции можно встроить, генерации функции можно избежать, выполнив компиляцию с параметром -fno-implement-inlines. Если какие-либо вызовы не будут встроены, возникнут ошибки компоновщика.

Сноски

(7)

Базовое имя файла — это его имя без начальной части пути и конечного суффикса, например «.h», «.C» или «.cc».

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/C_002b_002b-Interface.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API