Программирование >>  Инициализация объектов класса, структура 

1 ... 113 114 115 [ 116 ] 117 118 119 ... 395


директива связания в форме простой инструкции extern C void exit(int);

директива связывания в форме составной инструкции

extern C {

int printf( const char* ... ); int scanf( const char* ... );

директива связывания в форме составной инструкции

extern C {

#include <cmath>

Первая форма такой директивы состоит из ключевого слова extern, за которым следует строковый литерал, а за ним - обычное объявление функции. Хотя функция написана на другом языке, проверка типов вызова выполняется полностью. Несколько объявлений функций могут быть помещены в фигурные скобки составной инструкции директивы связывания - второй формы этой директивы. Скобки отмечают те объявления, к которым она относится, не ограничивая их видимости, как в случае обычной составной инструкции. Составная инструкция extern C в предыдущем примере говорит только о том, что функции printf() и scanf() написаны на языке С. Во всех остальных отношениях эти объявления работают точно так же, как если бы они были расположены вне инструкции.

Если в фигурные скобки составной директивы связывания помещается директива препроцессора #include, все объявленные во включаемом заголовочном файле функции рассматриваются как написанные на языке, указанном в этой директиве. В предыдущем примере все функции из заголовочного файла cmath написаны на языке С.

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

int main() {

ошибка: директива связывания не может появиться внутри тела функции extern C double sqrt( double ); double getValue(); правильно

double result = sqrt ( getValue() ); ...

return 0;

кода вызывает ошибку компиляции:

Если мы переместим директиву так, чтобы она оказалась вне тела main() , программа

extern C double sqrt( double ); int main() {

double getValue(); правильно

double result = sqrt ( getValue() );

...

return 0;

откомпилируется правильно:



функция calc () может быть вызвана из программе! на C

поможет и в этом:

extern C double calc( double dparm ) { /* ... */ }

Если в одном файле имеется несколько объявлений функции, то директива связывания может быть указана при каждом из них или только при первом - в этом случае она

extern

----math.h----

ern C double calc( double );

----math.C----объявление calc() в myMath.h

#include myMath.h

определение функции extern C calc() функция calc () может быть вызвана из программе! на C

распространяется и на все последующие объявления. Например:

double calc( double dparm ) { ... }

В данном разделе мы видели примеры директивы связывания extern C только для языка С. Это единственный внешний язык, поддержку которого гарантирует стандарт С++. Конкретная реализация может поддерживать связь и с другими языками. Например, extern Ada для функций, написанных на языке Ada; extern FORTRAN для языка FORTRAN и т.д. М1 описали один из случаев использования ключевого слова extern в С++. В разделе 8.2 мы покажем, что это слово имеет и другое назначение в объявлениях функций и объектов.

Упражнение 7.14

exit() , printf() , malloc() , strcpy() и strlen() являются функциями из библиотеки С. Модифицируйте приведенную ниже С-программу так, чтобы она компилировалась и связывалась в С++.

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

Как сделать С++ функцию доступной для программы на С? Директива extern C



const char *str = hello ;

void *malloc( int );

char *strcpy( char *, const char * ); int printf( const char *, ... ); int exit( int ); int strlen( const char * );

int main()

{ /* программа на языке С */

char* s = malloc( strlen(str)+l );

strcpy( s, str );

printf( %s, world\n , s );

exit( 0 );

7.8. Функция main(): разбор параметров командной строки

При запуске программы мы, как правило, передаем ей информацию в командной строке. Например, можно написать

prog -d -o of lie dataO

Фактические параметры являются аргументами функции miain () и могут быть получены из массива С-строк с именем argv; м1 покажем, как их использовать.

Во всех предыдущих примерах определение main() содержало пустой список:

int main() { ... }

Развернутая сигнатура main() позволяет получить доступ к параметрам, которые были заданы пользователем в командной строке:

int main( int argc, char *argv[] ){... }

argc содержит их количество, а argv - С-строки, представляющие собой отдельные значения (в командной строке они разделяются пробелами). Скажем, при запуске команды

prog -d -o ofile data0 argc получает значение 5, а argv включает следующие строки:

argv[ 0 ] = prog ;

argv[ 1 ] = -d ;

argv[ 2 ] = -o ;

argv[ 3 ] = ofile ;

argv[ 4 ] = dataO ;



1 ... 113 114 115 [ 116 ] 117 118 119 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика