我正在 openssl 阅读来源,如果尚未定义,则以下行显然会定义SSL_OP_NO_SSLv3
。从来没有见过这样的魔法。谁能教我这里的语法?
#if !defined(OPENSSL_NO_SSL3)
| SSL_OP_NO_SSLv3
#endif
您可以参考this link获取完整档案,并参阅第327行。
答案 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__
)