【发布时间】:2019-07-10 08:38:05
【问题描述】:
我正在尝试为 OpenSSL 实现错误处理,为了在 OpenSSL 中生成错误,我查看了一个函数 ERR_put_error,它将参数中指定的错误放入线程的错误队列中。这个函数有一个定义:
void ERR_put_error(int lib, int func, int reason, const char *file, int line);
如您所见,它接受 func 作为整数参数。但我们称这个函数为:
ERR_put_error(ERR_LIB_SSL,
SSL_F_SSL3_GET_RECORD,
SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
OPENSSL_FILE,
OPENSSL_LINE);
SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 在 include/openssl/sslerr.h 的 openssl 代码中定义,如下所示:
#define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291
这是因为 SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 是一个对应于整数的宏。我创建了一个包含所有错误名称的字符数组。现在,我将输入作为与 SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 同名的字符串(将整数输入传递给错误数组并获取名称)。
当我将它传递给这个函数时,它会抛出一个错误,因为它需要一个整数,但参数是 char * 类型。所以我的问题是为什么这个字符串没有被扩展为整数?另外,我怎样才能通过将输入作为字符串来实现呢?
【问题讨论】:
-
你能显示
SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY宏的代码吗?你说它是一个整数,也是一个字符串。 -
如果 API 函数需要一个整数,为什么你认为你可以传递一个字符串?你为什么要首先这样做?
-
"为什么这个字符串没有被扩展为整数" 这应该怎么发生? IStrings 永远不会自动“扩展”。宏被预处理器替换,字符串不是。
-
@Gerhardh ...正如我所提到的,我正在为我的应用程序实现一个错误处理程序,并看到它可以首先处理我需要生成它们的所有错误...有超过 200 个错误openssl,每个都用问题中提到的宏定义
-
“现在我将输入作为与 SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 同名的字符串(将整数输入传递给错误数组并获取名称)。” - 显示代码