C 宏定义中的逗号 (,)

comma (,) in C Macro Definition

我以前从未见过这种语法。

#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);
}

主要

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

The way i'm reading this is that SNS(s) = sizeof(s)-1.

你读错了。

What is the comma doing?

宏扩展导致 文本 替换。您可以使用 SNS(a) 两个 个参数传递给函数。

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

您可以看到 ft_display_fatal 有 4 个参数,但只提供了 3 个。这有效 因为 SNS 扩展为 2 个参数。如果没有,你会得到一个编译器错误。

宏只是文本替换,因此它们可以扩展到您想要的任何内容。在这种情况下,宏被用来扩展为一个函数的两个参数。该函数需要一个字符串和字符串中的字符数作为参数,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 减去该字节以获取字符串中重要字符的数量。这是 ft_display_fatal 函数的 len 参数(我不确定为什么它不能只使用 strlen() 来自己获取它——我想这是一种性能优化)。