C 当函数以整数作为参数时,如何将字符串作为参数传递?

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

我试图为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);
在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之后”的第一种方式实现它的。”…这是我做错的……我应该创建一个宏数组(如您所述)而不是以字符串格式包含错误名称的数组。谢谢