Странное использование фигурных скобок в вызове функции

Рассматриваемый код взят отсюда (так что вы можете увидеть полный контекст): https://www.anmolsarma.in/post/dccp/

В приведенных ниже вызовах setsockopt есть две части, о которых я не могу найти информацию, в основном потому, что я не знаю, что гуглить, потому что я не знаю, как это называется.

&(int) {1},

И :

&(int) {htonl(SERVICE_CODE)}

Итак, что делает {} в этом контексте? Я вполне понимаю, как это сделать с обычными круглыми скобками, но я думал, что {} зарезервированы для других целей.

eg:

&(int)(htonl(SERVICE_CODE))

Имеет ли это то же значение, что и выше? Я никогда раньше не видел, чтобы что-то подобное вставлялось в вызов функции. Я не уверен, что это C или C++, я подозреваю, что только C (на основе включений). Мне интересно, связано ли это как-то с тем, что htonl иногда является макросом, а иногда функцией, и как попытка использовать его в списке параметров функции может вызвать проблемы? Как называется эта конструкция (чтобы я мог погуглить и провести дополнительные исследования)?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

#include "dccp.h"

#define PORT 1337
#define SERVICE_CODE 42

int error_exit(const char *str)
{
    perror(str);
    exit(errno);
}

int main(int argc, char **argv)
{
    int listen_sock = socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);
    if (listen_sock < 0)
        error_exit("socket");

    struct sockaddr_in servaddr = {
        .sin_family = AF_INET,
        .sin_addr.s_addr = htonl(INADDR_ANY),
        .sin_port = htons(PORT),
    };

    if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &(int) {
               1}, sizeof(int)))
        error_exit("setsockopt(SO_REUSEADDR)");

    if (bind(listen_sock, (struct sockaddr *)&servaddr, sizeof(servaddr)))
        error_exit("bind");

    // DCCP mandates the use of a 'Service Code' in addition the port
    if (setsockopt(listen_sock, SOL_DCCP, DCCP_SOCKOPT_SERVICE, &(int) {
               htonl(SERVICE_CODE)}, sizeof(int)))
        error_exit("setsockopt(DCCP_SOCKOPT_SERVICE)");

...
}

person LawfulEvil    schedule 13.12.2016    source источник
comment
Да, кажется. Отметьте его как дубликат. Спасибо.   -  person LawfulEvil    schedule 13.12.2016