这个 C 习语是什么(if (1))?
What is this C idiom (if (1))?
我注意到 openssl 源代码中有一个奇怪的习语,here 并在下面重复:
if ((in == NULL) && (passwds == NULL)) {
if (1) { (* <---- HERE *)
#ifndef OPENSSL_NO_UI
/* build a null-terminated list */
static char *passwds_static[2] = { NULL, NULL };
passwds = passwds_static;
if (in == NULL)
if (EVP_read_pw_string
(passwd_malloc, passwd_malloc_size, "Password: ",
!(passed_salt || in_noverify)) != 0)
goto end;
passwds[0] = passwd_malloc;
} else {
#endif
BIO_printf(bio_err, "password required\n");
goto end;
}
}
看来这段代码相当于:
if ((in == NULL) && (passwds == NULL)) {
#ifndef OPENSSL_NO_UI
/* build a null-terminated list */
static char *passwds_static[2] = { NULL, NULL };
passwds = passwds_static;
if (in == NULL)
if (EVP_read_pw_string
(passwd_malloc, passwd_malloc_size, "Password: ",
!(passed_salt || in_noverify)) != 0)
goto end;
passwds[0] = passwd_malloc;
#else
BIO_printf(bio_err, "password required\n");
goto end;
#endif
}
我排除了一些解释:
- 可能是为
passwds_static
引入块作用域,但封闭的 if
将起到类似的作用
- 它可能是一个结构,通过几次有意义的转换变得毫无意义,但那个结构是存在的since the introduction of
OPENSSL_NO_UI
。
我是不是漏掉了什么?这个if (1)
有什么好处?这是否用于其他代码库?
谢谢!
看了其他类似的地方后,I found an explanation:
if (1) { /* This is a trick we use to avoid bit rot.
* at least the "else" part will always be
* compiled.
*/
#ifdef AF_INET6
family = AF_INET6;
} else {
#endif
BIOerr(BIO_F_ACPT_STATE, BIO_R_UNAVAILABLE_IP_FAMILY);
goto exit_loop;
}
在大多数情况下(包括他们的 CI 我猜),OPENSSL_NO_UI
没有定义,所以 both 分支被编译。如果 API 其中一个分支使用更改,它会被编译器发现,并且可以修复,而无需测试所有编译时开关。
它显然是用来删除不应该执行的代码,类似于使用 #ifdef
编译器开关。大多数情况下,像这样的奇怪事情比其他任何事情都更能说明版本控制不佳。
请注意,这不是推荐的做法 - 不应存在在任何情况下都不会执行的源代码。更好的做法是使用版本控制,或者如果那不可能使用编译器开关,或者如果那不可能那么 "comment out" 代码。
声明:
if(1) {
始终有匹配的左大括号作为右大括号。
我注意到 openssl 源代码中有一个奇怪的习语,here 并在下面重复:
if ((in == NULL) && (passwds == NULL)) {
if (1) { (* <---- HERE *)
#ifndef OPENSSL_NO_UI
/* build a null-terminated list */
static char *passwds_static[2] = { NULL, NULL };
passwds = passwds_static;
if (in == NULL)
if (EVP_read_pw_string
(passwd_malloc, passwd_malloc_size, "Password: ",
!(passed_salt || in_noverify)) != 0)
goto end;
passwds[0] = passwd_malloc;
} else {
#endif
BIO_printf(bio_err, "password required\n");
goto end;
}
}
看来这段代码相当于:
if ((in == NULL) && (passwds == NULL)) {
#ifndef OPENSSL_NO_UI
/* build a null-terminated list */
static char *passwds_static[2] = { NULL, NULL };
passwds = passwds_static;
if (in == NULL)
if (EVP_read_pw_string
(passwd_malloc, passwd_malloc_size, "Password: ",
!(passed_salt || in_noverify)) != 0)
goto end;
passwds[0] = passwd_malloc;
#else
BIO_printf(bio_err, "password required\n");
goto end;
#endif
}
我排除了一些解释:
- 可能是为
passwds_static
引入块作用域,但封闭的if
将起到类似的作用 - 它可能是一个结构,通过几次有意义的转换变得毫无意义,但那个结构是存在的since the introduction of
OPENSSL_NO_UI
。
我是不是漏掉了什么?这个if (1)
有什么好处?这是否用于其他代码库?
谢谢!
看了其他类似的地方后,I found an explanation:
if (1) { /* This is a trick we use to avoid bit rot.
* at least the "else" part will always be
* compiled.
*/
#ifdef AF_INET6
family = AF_INET6;
} else {
#endif
BIOerr(BIO_F_ACPT_STATE, BIO_R_UNAVAILABLE_IP_FAMILY);
goto exit_loop;
}
在大多数情况下(包括他们的 CI 我猜),OPENSSL_NO_UI
没有定义,所以 both 分支被编译。如果 API 其中一个分支使用更改,它会被编译器发现,并且可以修复,而无需测试所有编译时开关。
它显然是用来删除不应该执行的代码,类似于使用 #ifdef
编译器开关。大多数情况下,像这样的奇怪事情比其他任何事情都更能说明版本控制不佳。
请注意,这不是推荐的做法 - 不应存在在任何情况下都不会执行的源代码。更好的做法是使用版本控制,或者如果那不可能使用编译器开关,或者如果那不可能那么 "comment out" 代码。
声明:
if(1) {
始终有匹配的左大括号作为右大括号。