×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 695 из 714 Настройки
Объявление функций, написанных на языке, отличном от С++

Директива компоновки может существовать в двух формах: одиночной и составной. Директивы компоновки не могут располагаться в определении класса или функции. Некоторые директивы компоновки должны присутствовать в каждом объявлении функции.

В качестве примера рассмотрим некоторые из функций языка С, объявленные в заголовке >cstdlib:

>// гипотетические директивы компоновки, которые могли бы

>// присутствовать в заголовке С++

>// одиночная директива компоновки

>extern "С" size_t strlen(const char *);

>// составная директива компоновки

>extern "С" {

> int strcmp(const char*, const char*);

> char *strcat(char*, const char*);

>}

Первая форма состоит из ключевого слова >extern, сопровождаемого строковым литералом и "обычным" объявлением функции.

Строковый литерал указывает язык, на котором написана функция. Используемый компилятор обязан поддерживать директивы компоновки для языка С. Компилятор может поддерживать директивы компоновки и для других языков, например >extern "Ada", >extern "FORTRAN" и т.д.

Директивы компоновки и заголовки

Та же директива компоновки может быть применена к нескольким функциям одновременно. Для этого их объявления заключают в фигурные скобки после директивы компоновки. Эти фигурные скобки служат для группировки объявлений, к которым применяется директива компоновки. Эти фигурные скобки игнорируются, а имена функций, объявленных в их пределах, видимы, как будто функции были объявлены вне фигурных скобок.

Составная форма объявления применима ко всему файлу заголовка. Например, заголовок >cstring языка С++ может выглядеть следующим образом.

>// составная директива компоновки

>extern "С" {

>#include // функции языка С, манипулирующие строками

>                    // в стиле С

>}

Когда директива >#include заключена в фигурные скобки составной директивы компоновки, все объявления обычных функций в файле заголовка будут восприняты как написанные на языке, указанном в директиве компоновки. Директивы компоновки допускают вложенность, т.е. если заголовок содержит функцию с директивой компоновки, на данную функцию это не повлияет.

Функции, унаследованные языком С++ от языка С, могут быть определены как функции языка С, но это не является обязательным условием для каждой реализации языка С++.

Указатели на функции, объявленные в директиве >extern "С"

Язык, на котором написана функция, является частью ее типа. Чтобы объявить указатель на функцию, написанную на другом языке программирования, следует использовать директиву компоновки. Кроме того, указатели на функции, написанные на других языках, следует объявлять с той же директивой компоновки, что и у самой функции:

>// pf указывает на функцию С, возвращающую void и получающую int

>extern "С" void (*pf) (int);

Когда указатель >pf используется для вызова функции, созданный при компиляции код подразумевает, что происходит обращение к функции С.

Тип указателя на функцию С не совпадает с типом указателя на функцию С++. Указатель на функцию С не может быть инициализирован (или присвоен) значением указателя на функцию С++ (и наоборот). Как и при любом другом несовпадении типов, попытка присвоения указателя с другой директивой компоновки приведет к ошибке: