запятая (,) в макросе C - PullRequest
0 голосов
/ 01 июня 2018

Я никогда раньше не видел этот синтаксис.

#define SNS(s) (s),(sizeof(s)-1)

То, как я это читаю, это SNS(s) = sizeof(s)-1.Что делает запятая?Это необходимо?

int     ft_display_fatal(const char *err, unsigned len, int fd, int rcode)
{ 
    UNUSED(write(fd, err, len));
    return (rcode);
}

Main

return (ft_display_fatal(SNS("File name missing.\n"), 2, 1));

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Макросы - это просто замена текста, поэтому они могут расширяться практически до всего, что вам нужно.В этом случае макрос используется для раскрытия двух аргументов функции.Функция ожидает строку и количество символов в строке в качестве аргументов, и макрос SNS() генерирует их.Так что

ft_display_fatal(SNS("File name missing.\n"), 2, 1)

расширяется до

ft_display_fatal(("File name missing.\n"),(sizeof("File name missing.\n")-1), 2, 1)

Это в основном полезно, только если параметр является строковым литералом: sizeof("string") - это размер массива char, включая завершающий нольбайт, и -1 вычитает этот байт, чтобы получить количество значащих символов в строке.Это аргумент len для функции ft_display_fatal (я не уверен, почему он не может просто использовать strlen(), чтобы получить это сам по себе - я думаю, это оптимизация производительности).

0 голосов
/ 01 июня 2018

То, как я читаю это, заключается в том, что SNS (s) = sizeof (s) -1.

Вы читаете это неправильно.

Что делает запятая?

Расширение макроса приводит к замене текстовой .Вы можете использовать SNS(a) для передачи двух аргументов в функцию.

ft_display_fatal(SNS("File name missing.\n"), 2, 1)

Вы можете видеть, что ft_display_fatal занимает 4аргументы, но только 3 предоставляются.Это работает , потому что SNS расширяется до 2 аргументов.Если этого не произойдет, вы получите ошибку компилятора.

...