Язык программирования C++ для профессионалов


Связывание с программами на других языках - часть 2


extern "C" { #include <string.h> }

Обычно с помощью такого приема из стандартного заголовочного файла для С получают такой файл для С++. Возможно иное решение с помощью условной трансляции:

#ifdef __cplusplus extern "C" { #endif

char* strcpy(char*, const char*); int strcmp(const char*, const char*); int strlen(const char*); // ...

#ifdef __cplusplus } #endif

Предопределенное макроопределение __cplusplus нужно, чтобы обойти конструкцию extern "C" { ...}, если заголовочный файл используется для С.

Поскольку конструкция extern "C" { ... } влияет только на порядок связывания, в ней может содержаться любое описание, например:

extern "C" { // произвольные описания

// например:

static int st; int glob; }

Никак не меняется класс памяти и область видимости описываемых объектов, поэтому по-прежнему st подчиняется внутреннему связыванию, а glob остается глобальной переменной.

Укажем еще раз, что описание extern "C" влияет только на порядок связывания и не влияет на порядок вызова функции. В частности, функция, описанная как extern "C", все равно подчиняется правилам контроля типов и преобразования фактических параметров, которые в C++ строже, чем в С. Например:

extern "C" int f();

int g() { return f(1); // ошибка: параметров быть не должно }




Начало  Назад  Вперед



Книжный магазин