C宏定义中的逗号(,)

时间:2018-06-01 03:42:21

标签: c syntax macros definition comma

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

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

2 个答案:

答案 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个参数。如果它没有,你就会收到编译错误。