首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个C成语(如果(1))是什么?

这个C成语(如果(1))是什么?
EN

Stack Overflow用户
提问于 2017-03-28 08:27:43
回答 3查看 240关注 0票数 9

我注意到openssl源代码中有一个奇怪的成语,这里,并重复如下:

代码语言:javascript
复制
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;
        }
}

这段代码似乎相当于:

代码语言:javascript
复制
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也有类似的用途。
  • 它可以是一个通过几个有意义的转换变得毫无意义的构造,但是这个构造是OPENSSL_NO_UI的。

我是不是漏掉了什么?这个if (1)的优点是什么?这在其他代码库中使用吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-28 09:01:33

在查看了其他类似的地方后,我找到了一个解释

代码语言:javascript
复制
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没有定义,所以两个分支都被编译了。如果API中的一个分支使用更改,编译器将发现它,并且可以修复它,而无需测试所有编译时开关。

票数 10
EN

Stack Overflow用户

发布于 2017-03-28 09:42:04

它显然用于删除不应该执行的代码,类似于使用#ifdef编译器开关。通常情况下,像这样奇怪的事情表明版本控制比其他任何东西都更糟糕。

请注意,这是不推荐的做法-不应该有任何源代码在任何情况下都不会被执行。更好的做法是使用版本控制,或者如果不可能使用编译器开关,或者如果不可能,则“注释掉”代码。

票数 2
EN

Stack Overflow用户

发布于 2017-03-28 15:47:37

声明:

代码语言:javascript
复制
if(1) {

是始终有一个匹配的开口支撑为关闭支撑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43064381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档