2014-10-19 2 views
2

У меня есть заголовочный файл C, начиная с этого:Что делает '#pragma import on' делать?

#if PRAGMA_ONCE 
#pragma once 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

#if PRAGMA_IMPORT 
#pragma import on 
#endif 

#if PRAGMA_STRUCT_ALIGN 
    #pragma options align=mac68k 
#elif PRAGMA_STRUCT_PACKPUSH 
    #pragma pack(push, 2) 
#elif PRAGMA_STRUCT_PACK 
    #pragma pack(2) 

Мне любопытно, что #pragma import делает. Там есть #pragma importon ARM, и on AIX, но #pragma import on не похоже, что это сработало бы в любом случае.

Интересно, что поиск "pragma import on" -ada находит an extremely similar MIT boilerplate header file (вместе с кучей других файлов, содержащих похожий код), поэтому, вероятно, есть точка к этому (хотя я сомневаюсь, что это имеет значение в файле, который у меня есть).

Итак, есть ли какой-нибудь древний компилятор, где #pragma import on что-то делает? Я сомневаюсь, что есть какой-то практический момент узнать это, но мне любопытно.

ответ

3

This header, кажется, указывает, что прагма используется то, что называется MRC [с] компилятор от компании Apple Computer, Inc., который я не знаком с.

Wikipedia Macintosh Programmer's Workshop ссылки на Archive.org для получения некоторой документации по этому вопросу, и вы можете добраться до MrC/MrCpp Related Documentation оттуда со ссылкой на PDF для прагм.

А вот определение для этого конкретного прагме:

Синтаксис

#pragma import on 
#pragma import off 
#pragma import reset 
#pragma import [list] <name_list> 

Семантика

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

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

  1. Импортная прагма никогда не применяется к символам с областью видимости, то есть к тем, кто использует ключевое слово «статический». Указание такого символа в форме списка будет сообщено как ошибка прагмой.

  2. Прагмы импорта и экспорта являются ортогональными и могут применяться независимо.

  3. Импорт и внутренние прагмы взаимоисключающие. Импортная прагма отключит внутренний статус, если он установлен.