ssl_local.h openssl 头文件包含以下内容
# define SSL_CONNECTION_FROM_SSL(ssl) \
SSL_CONNECTION_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
# define SSL_CONNECTION_NO_CONST
# define SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, c) \
((ssl) == NULL ? NULL \
: ((ssl)->type == SSL_TYPE_SSL_CONNECTION \
? (c SSL_CONNECTION *)(ssl) \
: NULL))
这个宏被调用:
int SSL_connect(SSL *s)
{
SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
我不明白下面的宏是做什么的,因为它没有实际的定义。
# define SSL_CONNECTION_NO_CONST
但是它被用在上面提到的下面的宏中。
SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, c)
如您所见,宏用作
c
到 SSL_CONNECTION_FROM_SSL_ONLY_int
的第二个参数,并用作 SSL_CONNECTION
的前缀:
? (c SSL_CONNECTION *)(ssl) \
^^^^
SSL_CONNECTION_FROM_SSL_ONLY_int
中的ssl_local.h
实际上有多种用途:
# define SSL_CONNECTION_FROM_SSL(ssl) \
SSL_CONNECTION_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
# define SSL_CONNECTION_FROM_CONST_SSL(ssl) \
SSL_CONNECTION_FROM_SSL_int(ssl, const)
在
SSL_CONNECTION_NO_CONST
中用 SSL_CONNECTION_FROM_SSL
调用,这会将 c
扩展为空字符串,即
? ( SSL_CONNECTION *)(ssl)
^^^^
在
const
中用 SSL_CONNECTION_FROM_CONST_SSL
调用,这会将 c
扩展为 const
,即
? (const SSL_CONNECTION *)(ssl)
^^^^^^^