代码之家  ›  专栏  ›  技术社区  ›  Gabe Spound

C宏定义中的逗号(,)

  •  2
  • Gabe Spound  · 技术社区  · 8 年前

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

    #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 回复  |  直到 8 年前
        1
  •  5
  •   Barmar    8 年前

    宏只是文本替换,因此它们可以扩展到任何您想要的内容。在这种情况下,宏被用来扩展为一个函数的两个参数。函数需要一个字符串和字符串中的字符数作为参数,并且 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() 我想这是一个性能优化)。

        2
  •  2
  •   Employed Russian    8 年前

    我读这个的方式是sns=sizeof(s)-1。

    你看错了。

    逗号在做什么?

    宏扩展导致 文本的 替代。你可以用 SNS(a) 通过 二 函数的参数。

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

    你可以看到 ft_display_fatal 接受4个参数,但仅提供3个。这行得通 因为 SNS 展开为2个参数。如果没有,就会出现编译器错误。