Параметры IN / OUT и как с ними работать в C ++ - PullRequest
6 голосов
/ 01 августа 2011

При чтении документации по функциям из внешних библиотек разных видов я всегда видел состояние документации, что переменная должна быть [IN / OUT]. Может ли кто-нибудь дать мне подробное понимание того, как [IN / OUT] относится к параметрам функции, передаваемой по ссылке или по значению.

Вот пример функции, с которой я столкнулся, которая говорит мне, что ей нужен параметр [IN / OUT]:

Прототип: ULONG GetActivationState (ULONG * pActivationState);

Параметры

  • Тип: ULONG *
  • Переменная : pActivationState
  • Режим : ВХОД / ВЫХОД

Ответы [ 6 ]

8 голосов
/ 01 августа 2011

Этот параметр имеет вход / выход, потому что вы предоставляете значение, которое используется внутри функции, и функция изменяет его, чтобы информировать вас о том, что произошло внутри функции.Использование этой функции будет примерно таким:

ULONG activationState = 1; // example value
ULONG result = GetActivationState(&activationState);

обратите внимание, что вы должны указать адрес переменной, чтобы функция могла получить значение и установить значение вне функции.Например, функция GetActivationState может выполнять что-то вроде этого:

ULONG GetActivationState(ULONG* pActivationState)
{
    if (*pActivationState == 1)
    {
    // do something
    // and inform by the modification of the variable, say, resetting it to 0
       *pActivationState = 0;
    }
    // ...
    return *pActivationState; // just an example, returns the same value
}

Обратите внимание, как:

  1. Функция принимает параметр как неконстантный указатель на UINT.Это означает, что может изменить его.
  2. Функция может получить доступ к значению, которое вы дали параметру, путем разыменования его
  3. Функция может снова изменить параметр, разыменовав его.
  4. Вызывающая функция видит переменную activationState, содержащую новое значение (в нашем случае 0).

Это пример "передачи по ссылке", который выполняется с помощью указателей в C (а также со ссылками в C ++.)

5 голосов
/ 01 августа 2011

Как правило, вещи, помеченные как IN / OUT, будут передаваться через неконстантный указатель или ссылку, что позволяет функции напрямую изменять переменную, а также читать ее. Обязательно ознакомьтесь с документацией, чтобы узнать, ожидает ли она установки значения до ее передачи.

Параметры, помеченные как IN, будут передаваться по значению или по постоянному указателю или постоянной ссылке, не позволяя функции изменять переменную.

C ++ не применяет параметры OUT-only, но обычно они передаются с использованием неконстантного указателя или ссылок, аналогично IN / OUT.

4 голосов
/ 01 августа 2011

Эта часть относится ко всем типам параметров - большинство библиотечных интерфейсов стараются быть совместимыми с C, поэтому чаще передают параметры по указателю, а не по ссылке.

IN: Когда параметр указан как IN, интерфейс предоставляет гарантию, что он не будет изменять этот параметр. На мой взгляд, это лучше передать, отметив параметр как const, тогда сам язык предотвратит изменение значения. Если этот параметр передается по значению, не имеет значения, помечен ли он в документации как IN (или const в прототипе), поскольку параметр в любом случае является локальным для функции. Но чтобы избежать копирования, его можно передавать по ссылке или по указателю, и в этом случае ключевое слово const становится очень важным.

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

IN / OUT: Параметр IN / OUT обычно указывает что-то, где значения входа и выхода имеют смысл. Например, если у вас есть библиотечная функция, которая заполняет буфер, вам может потребоваться передать указатель на буфер вместе с другим указателем, указывающим длину буфера. Когда функция возвращается, второй указатель может содержать фактическое количество байтов, записанных в буфер.

2 голосов
/ 01 августа 2011

Если параметр OUT, он должен быть передан по ссылке. Параметр чисто IN обычно передается по значению или константной ссылке, если стоимость копирования слишком высока (ничто не мешает разработчикам передавать его по ссылке, но это не очень хороший дизайн, IMHO). Параметр IN / OUT должен быть передан по ссылке.

1 голос
/ 01 августа 2011

У меня смешанное мнение относительно использования входов, выходов и выходов / выходов.

Перевернутая сторона: если все сделано правильно, он сообщает о намерении читателю документации.

Недостаток: слишком часто это делается неправильно. Эти обозначения, очевидно, не являются частью языка; они либо в комментариях, либо в каком-то документе, который поддерживается отдельно от кода. Я видел слишком много случаев, когда параметр был помечен как «out», но первое, что было сделано в коде с этим параметром, это его использование в качестве значения в правой части.

0 голосов
/ 01 августа 2011

Вы можете использовать значение (просто тип) или постоянную ссылку const & только для ввода параметров.Используйте неконстантную ссылку & или указатель * в качестве параметра in / out для изменения значения переменной.Вы также можете использовать указатель ссылки * &, чтобы позволить вам изменить адрес, на который указывает фактический указатель (вход / выход).Как указал Дейв Смит , в C ++ отсутствует единственный параметр out.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...