Есть ли способ передать указатель на переменную без ее предварительного определения на основе прототипа функции, требующей указатель как единицу, если ее параметры? - PullRequest
2 голосов
/ 22 апреля 2020

У меня были проблемы с recv(), когда я всегда получал бы возврат -1, несмотря на наличие байтов для чтения. Моя проблема заключалась в том, что я называл это так:

ret = recvfrom(socket, &result, 10, 0, (struct sockaddr *)&addr, (socklen_t)(sizeof(addr)));

В то время как последний параметр был фактически требованием для адреса переменной, который имеет размер th ie как таковой. Правильный вызов был таким:

socklen_t recsize = sizeof(addr);
ret = recvfrom(socket, &result, 10, 0, (struct sockaddr *)&addr, &recsize);

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

1 Ответ

3 голосов
/ 22 апреля 2020

C

Использовать составной литерал .

ret = recvfrom(..., &(socklen_t){sizeof(addr)});

Объект, созданный таким литералом, автоматически c длительность хранения (будет уничтожен примерно, когда управление достигает следующего }).

C ++

Напишите функцию, которая возвращает адрес значения r:

template <typename T>
[[nodiscard]] T *address_of_rvalue(T &&ref)
{
    return &ref;
}

Используйте это так :

ret = recvfrom(..., address_of_rvalue(socklen_t(sizeof(addr)));

Временная переменная, созданная в этом выражении, будет уничтожена в конце полного выражения (примерно, когда элемент управления достигнет ;).

...