C 当函数以整数作为参数时,如何将字符串作为参数传递?
我试图为OpenSSL实现错误处理,为了在OpenSSL中生成一个错误,我查看了一个函数ERR_put_error,它将参数中指定的错误放入线程的错误队列中。此函数定义为:C 当函数以整数作为参数时,如何将字符串作为参数传递?,c,openssl,macros,C,Openssl,Macros,我试图为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_SSL
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);
在include/openssl/sslerr.h的openssl代码中定义了关闭通知后的SSL应用程序数据,如下所示:
#在关闭后定义SSL_R_应用程序_数据_通知291
这是因为SSL\u R\u APPLICATION\u DATA\u AFTER\u CLOSE\u NOTIFY是一个对应于整数的宏。我已经创建了一个包含所有错误名称的字符数组。现在,我以字符串形式提供输入(将整数输入传递到错误数组并获取名称),该字符串在关闭通知后与SSL应用程序数据同名
当我把它传递给这个函数时,它会抛出一个错误,因为它需要一个整数,但参数的类型是char*。所以我的问题是为什么这个字符串没有扩展成整数?另外,如何通过将输入作为字符串来实现这一点 我已经创建了一个包含所有错误名称的字符数组 你是说这个吗
char err[256] = "SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY "
"SSL_R_APP_DATA_IN_HANDSHAKE "
"SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT"
"SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE"
"SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE"
"SSL_R_BAD_CHANGE_CIPHER_SPEC"
"SSL_R_BAD_CIPHER"
"SSL_R_BAD_DATA";
还是这个
char err[256] = {SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
SSL_R_APP_DATA_IN_HANDSHAKE,
SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,
SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE,
SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE,
SSL_R_BAD_CHANGE_CIPHER_SPEC,
SSL_R_BAD_CIPHER,
SSL_R_BAD_DATA
};
在以下两种情况下,调用都不起作用
ERR_put_error(ERR_LIB_SSL,
SSL_F_SSL3_GET_RECORD,
err,
OPENSSL_FILE,
OPENSSL_LINE);
由于err
属于char*
类型,但函数接受int
您可以尝试如下定义并在循环中调用函数
int err[8] = {SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
SSL_R_APP_DATA_IN_HANDSHAKE,
SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,
SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE,
SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE,
SSL_R_BAD_CHANGE_CIPHER_SPEC,
SSL_R_BAD_CIPHER,
SSL_R_BAD_DATA
};
for (int i = 0; i< 8; i++) {
ERR_put_error(ERR_LIB_SSL,
SSL_F_SSL3_GET_RECORD,
err[i],
OPENSSL_FILE,
OPENSSL_LINE);
}
int err[8]={SSL\u R\u应用程序\u数据\u关闭后\u通知,
SSL\u R\u应用程序中的数据\u握手,
SSL\u R\u尝试\u在不同的\u上下文中重用\u会话\u,
SSL\u R\u至少\u TLS\u 1\u 0\u需要\u FIPS\u模式,
在SUITEB模式下,至少需要SSL\u R\u\u TLS\u 1\u 2\u,
SSL\u R\u错误\u更改\u密码\u规范,
SSL\R\u坏的\u密码,
SSL\R\u坏数据
};
对于(int i=0;i<8;i++){
ERR_put_error(ERR_LIB_SSL,
SSL\u F\u SSL3\u获取\u记录,
呃,,
OPENSSL_文件,
OPENSSL(u线),;
}
在关闭\u NOTIFY宏后,是否可以显示SSL\u R\u应用程序\u数据\u的代码。你说它是一个整数,也是一个字符串。如果一个API函数需要一个整数,为什么你认为你可以传递一个字符串?你为什么要这么做呢?“为什么这个字符串没有扩展成整数”这怎么会发生?IString永远不会自动“扩展”。宏被预处理器取代,字符串则不是。@Gerhardh。。。正如我所提到的,我正在为我的应用程序实现一个错误处理程序,为了确保它能够首先处理生成它们所需的所有错误……openssl中有200多个错误,每个错误都是用宏定义的,正如问题“现在我以字符串形式提供输入”中提到的那样(将整数输入传递到错误数组并获取名称),该数组与SSL\u R\u应用程序\u数据\u在\u CLOSE\u NOTIFY之后具有相同的名称。“-显示代码我是以char err[256]=“SSL\u R\u应用程序\u DATA\u CLOSE\u NOTIFY之后”的第一种方式实现它的。”…这是我做错的……我应该创建一个宏数组(如您所述)而不是以字符串格式包含错误名称的数组。谢谢