В стандарте есть места, которые приводят правила для Си, а не для С++. В этих случаях правило для Си должно применяться к случаю С++, как соответствующее. В частности, значения констант, данных в тексте, одинаковы для Си и ФОРТРАНА. Перекрестный список констант с именами С++ приводится в Приложении А.
Мы используем формат объявления 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. В то время как эти рекомендации могут быть достаточны в большинстве случаев, они не могут быть подходящими для всех ситуаций. В случаях неоднозначности или там, где желательна определенная семантическая инструкция, эти рекомендации могут быть заменены, как это диктует ситуация.
namespace
называемого MPI
.
MPI_
'' префикса и без объектного префикса имени
(если применимы). Кроме того:
const
.
MPI_STATUS
(или массив), этот аргумент выпадает из
списка, и функция возвращает это значение.
Пример 2.1 Привязка С++ для MPI_COMM_SIZE
есть
int MPI::Comm::Get_size (void) const
.
void
.
Пример 2.2 Привязка С++ для MPI_REQUEST_FREE
есть
void MPI::Request::Free (void)
Пример 2.3 Привязка С++ для MPI_BUFFER_ATTACH
есть
void MPI::Attach_buffer(void* buffer, int size)
.
const
.