next up previous contents
Next: Процессы Up: Привязка к языку Previous: Привязка языка Си   Contents

Привязка языка С++

В стандарте есть места, которые приводят правила для Си, а не для С++. В этих случаях правило для Си должно применяться к случаю С++, как соответствующее. В частности, значения констант, данных в тексте, одинаковы для Си и ФОРТРАНА. Перекрестный список констант с именами С++ приводится в Приложении А.

Мы используем формат объявления ANSI С++. Все имена MPI объявлены в пределах пространства имен, называемого MPI, и поэтому упомянуты с префиксом MPI::. Определенные константы пишутся заглавными буквами, а у имен класса, определенных типов и функций только их первый символ напечатан прописной буквой. Программы не должны объявлять переменные или функции в пространстве имен MPI. Это принято, чтобы избежать возможных проверок на пересечение имен.

Определение именованных констант, функциональных прототипов, и определений типов должно находиться в подключаемом файле mpi.h.

Совет разработчикам: Файл mpi.h может содержать определения как Си, так и С++. Обычно можно просто использовать предопределенный символ препроцессора (вообще __cplusplus, но не обязательно) чтобы видеть, используется ли С++, чтобы защитить определения С++. Возможно, что компилятор Си будет требовать, чтобы источник, защищенный таким образом, был законным кодом Си. В этом случае, все определения С++ могут быть помещены в различные файлы для включения и может использоваться директива ``#include'', чтобы включить необходимые определения С++ в файл mpi.h. []

Функции С++, которые создают объекты или возвращают информацию, обычно размещают объект или информацию в возвращаемом значении. В то время, как нейтральные прототипы языка функций MPI включают возвращаемое значение С++ как параметр OUT, семантические спецификации функций MPI относятся к возвращаемому значению С++ с таким же именем параметра (см. Раздел B.13.5 на стр. 356). Остальные функции С++ возвращают void.

В некоторых обстоятельствах MPI разрешает пользователям указывать, что они не хотят использовать возвращаемое значение. Например, пользователь может указывать, что состояние не должно быть заполнено. В отличие от Си и ФОРТРАН, где это достигнуто через специальное входное значение, в С++ это сделано при наличии двух привязок, где одна имеет необязательный аргумент, а другая - нет.

Функции С++ не возвращают коды ошибки. Если заданный по умолчанию обработчик ошибки был установлен в MPI::ERRORS_THROW_EXCEPTIONS, используется механизм исключения С++, чтобы сообщить об исключении MPI::Exception.

Следует отметить, что заданный по умолчанию обработчик ошибки (MPI::ERRORS_ARE_FATAL) в данном случае не изменился. Также разрешается использовать пользовательские обработчики ошибок. MPI::ERRORS_RETURN просто возвращает управление на функцию запроса; не имеется никакой возможности для пользователя, чтобы восстановить код ошибки.

Пользовательские функции повторного вызова, которые возвращают целочисленные коды ошибки, не должны вызывать исключения; возвращенная ошибка будет обработана реализацией MPI, вызывая соответствующий обработчик ошибки.

Совет пользователям: Программисты С++, которые хотят обработать ошибки MPI сами, должны использовать обработчик ошибок MPI::ERRORS_THROW_EXCEPTIONS вместо
MPI::ERRORS_RETURN, который используется для той же цели в Си. Необходимо проявлять осторожность, используя исключения в ситуациях смешанных языков. []

Указатели скрытых объектов должны быть объектами в себе, и иметь отменяемые операторы присваивания и равенства, чтобы выполняться семантически подобно их дубликатам Си и ФОРТРАН.

Аргументы массива индексированы с нуля.

Логические флаги имеют тип bool.

Аргументами выбора являются указатели типа void *.

Аргументы адреса имеют MPI-определенный целочисленный тип MPI::Aint, определенный, как целое число достаточного размера, чтобы содержать любой действительный адрес на целевой архитектуре. Аналогично, MPI::Offset - целое число, достаточное, чтобы содержать смещения файла.

Большинство функций MPI - методы классов MPI С++. Имена класса MPI сгенерированы из нейтральных типов языка MPI, опуская префикс MPI_ и определяя тип в пределах пространства имен MPI. Например, MPI_DATATYPE становится MPI::Datatype.

Имена функций MPI-2 вообще соответствуют данным правилам обозначения. В некоторых случаях, новая функция MPI-2 связана с функцией MPI-1 именем, которое не соответствует соглашениям об именах. В этом случае независимое от языка имя аналогично имени MPI-1 даже при том, что это дает имя MPI-2, которое нарушает соглашения об именах. Имена языка Си и ФОРТРАН - такие же как независимое от языка имя в этом случае. Однако, имена С++ для MPI-1 отражают правила обозначения и могут отличаться от имен языка Си и ФОРТРАН. Таким образом, имя в С++, аналогичное к имени MPI-1 отличается от независимого от языка имени. Это приводит к имени С++, отличающемуся от независимого от языка имени. Пример этого - независимое от языка имя MPI_FINALIZED и имя С++ MPI::Is_finalized.

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

typedef MPI::Grequest::Query_function();

выглядела бы так:

namespace MPI { class Request { // ... }; class Grequest : public MPI::Request { // ... typedef int Query_function(void* extra_state, MPI::Status& status); }; };

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

typedef int MPI::Grequest::Query_function(void* extra_state, MPI::Status& status);

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

  1. Все функции, типы, и константы объявлены в пределах namespace называемого MPI.
  2. Массивы указателей MPI всегда оставлены в списке параметров (являются ли они IN или OUT аргументами).
  3. Если список параметров функции MPI содержит скалярный указатель IN, и имеет смысл определять функцию как метод объекта, соответствующего этому указателю, функция сделана функцией-членом соответствующего класса MPI. Функции-члены именованы согласно соответствующему имени функции MPI, но без ``MPI_'' префикса и без объектного префикса имени (если применимы). Кроме того:

    1. скалярный указатель IN выпадает из списка параметров, и это соответствует выпавшему аргументу.
    2. функция объявлена const.

  4. Функции MPI встроены в функции класса (статические), когда они принадлежат классу, но не имеют уникального скалярного IN или INOUT параметра того класса.
  5. Если список параметров содержит единственный аргумент OUT, который не является типом MPI_STATUS (или массив), этот аргумент выпадает из списка, и функция возвращает это значение.

Пример 2.1 Привязка С++ для MPI_COMM_SIZE есть int MPI::Comm::Get_size (void) const.

  1. Если имеются мночисленные OUT аргументы в списке параметров, каждый выбран как возвращаемое значение и удален из списка.
  2. Если список параметров не содержит никаких OUT аргументов, функция возвращает void.

Пример 2.2 Привязка С++ для MPI_REQUEST_FREE есть void MPI::Request::Free (void)

  1. Функции MPI, к которым вышеупомянутые правила не применяются, не являются членами любого класса, но определены в пространстве имен MPI.

Пример 2.3 Привязка С++ для MPI_BUFFER_ATTACH есть
void MPI::Attach_buffer(void* buffer, int size).

  1. Все имена классов, определенные типы и имена функции имеют только первый символ, напечатанный прописными буквами. Определенные константы набраны все заглавными буквами.
  2. Любой IN указатель, ссылка или аргумент массива должны быть объявлены const.
  3. Указатели передаются по ссылке.

  4. Аргументы массива обозначены квадратными скобками ([]), не указатели, поскольку это семантически более точно.


next up previous contents
Next: Процессы Up: Привязка к языку Previous: Привязка языка Си   Contents
Alex Otwagin 2002-12-10