Spec-Zone.ru › GCC 11

Далее: Где шаблон?, Предыдущее: Нечеткая связь, Вверх: Расширения языка C++ [Оглавление][Индекс]

7.4 Директивы C++ для интерфейса и реализации ¶

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

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

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

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

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

#pragma implementation
#pragma implementation "objects.h"

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

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

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

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

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

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

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

Примечания

(8)

Базовым именем файла является имя, очищенное от всей начальной информации пути и от суффиксов, таких как ‘.h’ или ‘.C’ или ‘.cc’.

Далее: Где шаблон?, Предыдущее: Нечеткая связь, Вверх: Расширения языка C++ [Оглавление][Индекс]

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

Spec-Zone.ru

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