我以前从未见过这种语法。
#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));
答案 0 :(得分:5)
宏只是文本替换,所以它们可以扩展到你想要的任何东西。在这种情况下,宏被用于扩展为函数的两个参数。该函数需要一个字符串和字符串中的字符数作为参数,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()
来实现这一点 - 我猜它&# 39;性能优化)。
答案 1 :(得分:2)
我读这篇文章的方式是SNS(s)= sizeof(s)-1。
你读错了。
逗号在做什么?
宏扩展会导致文本替换。您可以使用SNS(a)
将两个参数传递给函数。
ft_display_fatal(SNS("File name missing.\n"), 2, 1)
您可以看到ft_display_fatal
有4个参数,但只提供了3个参数。这工作因为 SNS
扩展为2个参数。如果它没有,你就会收到编译错误。