Spec-Zone.ru › GCC 10

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

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

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

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

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

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

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

#pragma implementation
#pragma implementation "objects.h"

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

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

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

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

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

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

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

Примечания

(4)

Базовое имя файла — это имя, из которого удалены вся информация о пути и все последующие суффиксы, такие как ‘.h’ или ‘.C’ или ‘.cc’.

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

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

Spec-Zone.ru

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