setsockopt()
требует указатель на выделенную переменную.Независимо от того, размещается ли эта переменная статически или динамически, это не имеет значения, если она имеет доступный адрес памяти, который можно получить во время выполнения и затем разыменовать для доступа к данным по этому адресу.
Ваш исходный кодделает точно это.Он объявляет локальную переменную, которая размещается в автоматической памяти (то есть в стеке вызовов вызывающего потока), затем использует оператор address-of &
, чтобы получить адрес памяти этой переменной, и передает этот адрес в setsockopt()
,Вещи не становятся намного проще, чем это.
Другие ответы, которые вам дали, это просто более сложные вариации этой же темы - присвоение значения переменной и затем получение адреса этой переменной.
Чтобы сохранить УЖЕ КРАЙНИЕ МИНИМАЛЬНЫЕ накладные расходы на объявление переменной примитивного типа и заполнение ее данными, вы можете выполнить это статически во время компиляции, используя глобальную переменную, которая инициализируется один раз при запуске программы и повторно используется при необходимости, например:
const int cReuseAddrOn = 1;
void setReuseAddrOn(int s)
{
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &cReuseAddrOn, sizeof (cReuseAddrOn));
}
Я бы предположил, что такие вещи, как %ref(1)
, в других языках, вероятно, будут реализованы аналогично этому, создавая ссылку на временно размещенную переменную или литеральную константу многократного использования.