在函数调用中奇怪使用花括号

时间:2016-12-13 14:29:55

标签: c htonl

有问题的代码来自这里(所以你可以看到完整的上下文):https://www.anmolsarma.in/post/dccp/

在下面的setsockopt调用中,有两件我似乎无法找到相关信息,主要是因为我不知道该怎么回事,因为我不知道它叫什么。

&(int) {1},

并且:

&(int) {htonl(SERVICE_CODE)}

那么,{}在这种情况下做了什么?我完全可以看到用普通括号做的,但我认为{}被保留用于其他用途。

例如:

&(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)");

...
}

0 个答案:

没有答案