关于OpenSSL中无定义宏SSL_CONNECTION_NO_CONST的作用咨询
解析OpenSSL中
SSL_CONNECTION_NO_CONST空宏的作用 相关代码片段
ssl_local.h中的宏定义:
# 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); }
宏的具体作用
这个空宏是const修饰符的开关占位符,核心目的是复用同一个底层宏来生成两种指针类型的转换逻辑:
- 当传入
SSL_CONNECTION_NO_CONST时,因为它是空定义,宏展开后(c SSL_CONNECTION *)(ssl)就变成(SSL_CONNECTION *)(ssl),得到非const的指针类型,适配SSL_connect这类需要修改连接对象的场景。 - 必然存在另一个配套宏(比如定义为
const的SSL_CONNECTION_CONST),当需要返回const SSL_CONNECTION*时,会调用类似SSL_CONNECTION_FROM_CONST_SSL(ssl)的接口,传入SSL_CONNECTION_CONST,此时展开后就是(const SSL_CONNECTION *)(ssl),用于那些只读取连接状态、不允许修改的函数。
这种设计避免了重复编写几乎完全一致的宏代码,通过占位符参数切换指针的const属性,是C语言中复用代码、处理const/非const类型兼容的常用技巧。
内容的提问来源于stack exchange,提问作者programming_in_custom
相关产品推荐
相关产品推荐

