代码之家  ›  专栏  ›  技术社区  ›  Eziz Durdyyev

c语言中不熟悉的函数声明

gcc c
  •  2
  • Eziz Durdyyev  · 技术社区  · 6 年前

    我在调查SslSplit code opts.h 文件。这些函数的定义非常简单,但我需要一些关于声明的帮助。在这里:

    选项h:

    char *proxyspec_str(proxyspec_t *) NONNULL(1) MALLOC;
    void opts_set_crl(opts_t *, const char *) NONNULL(1,2);
    

    选项c:

    void
    opts_set_crl(opts_t *opts, const char *optarg)
    {
        if (opts->crlurl)
            free(opts->crlurl);
        opts->crlurl = strdup(optarg);
        log_dbg_printf("CRL: %s\n", opts->crlurl);
    }
    
    char *
    proxyspec_str(proxyspec_t *spec)
    {
        char *s;
        char *lhbuf, *lpbuf;
        char *cbuf = NULL;
    
        // Some code..
    
        return s;
    }
    

    属性h:

    #define WUNRES          __attribute__((warn_unused_result))
    #define MALLOC          __attribute__((malloc)) WUNRES
    #define NONNULL(...)    __attribute__((nonnull(__VA_ARGS__)))
    

    我的问题是,函数声明末尾的NONNULL和MALLOC是什么意思?

    1 回复  |  直到 6 年前
        1
  •  3
  •   user2357112    6 年前

    正如你自己指出的, NONNULL MALLOC 宏。他们的替代者从 __attribute__ 是编译器扩展关键字,用于定义属性 在函数中。

    这个 __VA_ARGS__ 宏中的参数(用 ... 宣言:

    void opts_set_crl(opts_t *, const char *) NONNULL(1,2);
    

    它)分为:

    void opts_set_crl(opts_t *, const char *) __attribute__((nonnull(1,2)));
    

    这有效地防止了第一次和第二次 存在的第二个参数 NULL . 如果你检查一下 例如 gcc clang 你会发现

    另一个属性, malloc ,从 GNU manual :

    函数返回的指针P不能别名任何其他指针 对象出现在由P寻址的任何存储器中。

    使用此属性可以改进优化。像malloc这样的函数 不具有此属性,因为它们可以返回指向存储的指针