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()
来自己获取它——我想这是一种性能优化)。
我以前从未见过这种语法。
#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()
来自己获取它——我想这是一种性能优化)。