Поделиться через


Спецификации компоновки

Термин "спецификация компоновки" относится к протоколу, связать функции (или процедуры), написанные на разных языках.Следующие соглашения о вызовах затрагиваются.

  • Чувствительность к регистру имен.

  • Оформление имен.В c# имен префиксов компилятора с символа подчеркивания.Это часто называется "украшением". В C++ дополнение имен используется для сохранения сведений о типе через этап компоновки.(См. Внутренние имена)

  • Порядок аргументов, ожидаемых в стеке.

  • Обязанностью для обработки стеком при возврате функции.Или вызываемая функция или вызывающая функция отвечают.

  • Передача скрытых аргументов передаются ли какие-либо аргументы (скрытые).

extern string-literal { declaration-list }
extern string-literal declaration

Спецификация компоновки облегчает постепенно перенос кода c#, C++, разрешить использование существующего кода.

Только для систем Microsoft

Единственные спецификации компоновки в настоящее время поддерживаемых microsoft C++ "C" и "C++".

ЭЛЕМЕНТ, относящийся Майкрософт

В следующем примере объявляется функции atoi и atol с компоновкой c:

extern "C"
{
    int  atoi( char *string );
    long atol( char *string );
}

К этим функциям позвонены с помощью компоновка c.Один и тот же результат может быть достиган с этими объявлениями: 2

extern "C" int  atoi( char *string );
extern "C" long atol( char *string );

Только для систем Microsoft

Весь стандарт microsoft c# содержит директивы условной компиляции использования файлов для обнаружения компиляция C++.При компиляции C++ прототипы обнаружена, заключенные в extern "C" директива выглядит следующим образом:

// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif

// Function declarations

#if defined(__cplusplus)
}
#endif 

ЭЛЕМЕНТ, относящийся Майкрософт

Нет необходимости объявлять, что функции в стандарте включают файлы как extern "C".

Если функция перегружена, то не более чем одной из функций того же имени может содержать описатель компоновки.(Дополнительные сведения см. в разделе перегружать функции.)

Следующая таблица показывает, как различные спецификации компоновки.

Влияние спецификации компоновки

Спецификация

Действие

Для объекта

Затрагивает только компоновка объекта

В функции

Влияет на связь данной функции и всех функций или объекты, объявленные внутри него

В классе

Влияет на связь всех функций и объектов nonmember, объявленных внутри класса

Если функция принимает более одной спецификации компоновки, то они должны требованию. ошибка для объявления функции как имеющий и компоновка c и C++.Более того, если для 2 объявления функции происходят в программе, то - одном с спецификацией компоновки и одним если параметр - объявление со спецификацией компоновки должен быть первым.Предоставляется всем объявлениям функций резервного копирования, которые уже имеют спецификация компоновки переключатель, заданного в первом объявлении.Примеры.

extern "C" int CFunc1();
...
int CFunc1();            // Redeclaration is benign; C linkage is
                         //  retained.

int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
                         //  CFunc2;  cannot contain linkage
                         //  specifier.

Функции и объекты явным образом, объявленные как Статический в теле описателя компоновки (смеси ) обрабатывать как статические функции или объекты; описатель переключателя пропущен.Другие функции и объекты поведение, если объявлено использование extern ключевое слово.(См. Использование extern, чтобы определить связь дополнительные сведения о extern ключевое слово.)

См. также

Ссылки

Использование extern, чтобы определить связь