如何理解这种在C中添加定义的方法?

时间:2017-01-30 10:53:08

标签: c

我正在 openssl 阅读来源,如果尚未定义,则以下行显然会定义SSL_OP_NO_SSLv3。从来没有见过这样的魔法。谁能教我这里的语法?

#if !defined(OPENSSL_NO_SSL3)
    | SSL_OP_NO_SSLv3
#endif

您可以参考this link获取完整档案,并参阅第327行。

2 个答案:

答案 0 :(得分:2)

这个问题只适用于周围的代码(这里略微简化):

    mask =  SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1
#if !defined(OPENSSL_NO_SSL3)
                  |SSL_OP_NO_SSLv3
#endif
    ;

预处理器只进行文本替换。因此,如果未定义预处理器宏OPENSSL_NO_SSL3,则预处理代码将如下所示:

    mask =  SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1
                  |SSL_OP_NO_SSLv3
    ;

否则预处理的代码看起来像这样:

    mask =  SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1
    ;

答案 1 :(得分:1)

它没有定义宏。它为位掩码添加了一个表达式。那个操作有点或者。必须存在宏/枚举SSL_OP_NO_SSLv3才能使其成为有效代码。

如果宏OPENSSL_NO_SSL3 已定义,则条件中的代码不会包含在源代码中。

让预处理器检查宏定义是实现条件编译的常用方法。这样,可以在各种配置下编译相同的源。要检查的宏可以在源#define中定义,由构建系统传递(与gcc -D选项一样),或者内置到预处理器(例如__STDC_IEC_559__

相关问题