Читать «Справочное руководство по C++» онлайн - страница 39

Бьярн Страустрап

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

Из множества перегруженных функций (§R.13) с данным именем не более одной может иметь связывание с языком C, см. §R.7.4.

Связывание можно установить для объектов, например:

extern "C" {

 //…

 _iobuf_iob[_NFILE];

 //…

 int _flsbuf(unsigned,_iobuf*);

 //…

}

Когда задается спецификация связи, то функции и объекты можно описать как статические внутри { }. Для таких функций или объектов команда связывания игнорируется. Иначе, функция, описанная при задании связи, трактуется, как если бы она была явно описана как extern, например, ниже второе описание ошибочно (§R.7.1.1):

extern "C" double f();

static double f(); // ошибка

Объект, описанный внутри конструкции

extern "C" {/*… */}

все же считается определенным, а не просто описанным.

Связывание объектов на C++ с объектами, определенными на других языках, так же как и обратное связывание, зависит от языков и реализации. Такое связывание возможно только в том случае, когда алгоритмы размещения объектов в памяти являются достаточно схожими для двух языков.

Если для задания связи в строке-литерале из спецификации-связи используется имя языка программирования, то рекомендуется, чтобы написание этого имени копировалось из документа, определяющего данный язык, например, Ada (а не ADA) и Fortran (а не FORTRAN).

R.8 Описатели

Список-описателей, фигурирующий в описании, - это последовательность через запятую описателей, каждый из которых может иметь инициализатор.

список-описаний:

 описатель-с-инициализатором

 список-описаний , описатель-с-инициализатором

описатель-с-инициализатором:

 описатель инициализатор opt

Описание состоит из двух частей: спецификации (спецификация-описания; см. §R.7.1) и описателей (список-описателей). Спецификации задают основной тип, класс памяти или другие свойства описываемых объектов и функций. Описатели задают имя этих объектов и функций, а также, возможно, изменяют тип с помощью таких операций, как * (указатель на) и () (функция возвращающая). В описателе также можно задать начальные значения, инициализация обсуждается в §R.8.4 и §R.12.6.

Описатели имеют такой синтаксис:

описатель:

 имя-в-описателе

 операция-ptr описатель

 описатель ( список-описаний-параметров ) список-спецификаций-cv opt

 описатель [ выражение-константа opt ]

 ( описатель )

операция-ptr: