私は、OpenSSLのソースコードで奇妙なイディオムに気づいhere、以下を繰り返す:このCイディオム(if(1))とは何ですか?
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
はsimそれ以外にもいくつか意味のある変換が無意味になるコンストラクトかもしれませんが、そのコンストラクトはsince the introduction ofOPENSSL_NO_UI
です。
ここに何か不足していますか?このif (1)
の利点は何ですか?これは他のコードベースで使用されていますか?
ありがとうございます!他の同様の場所で見た後
それは唯一の目的は、何らかの理由で '#else'節を避けることです。 – StoryTeller
Dup of http://stackoverflow.com/questions/2266060/why-would-somebody-use-an- if-1-c-preprocessor-directive? – CristiFati
@CristiFati - いいえ。これは、#if 1についてのものではありません。なぜなら、そのコンストラクトは質問に全く現れないからです。それは 'if(1)'についてです。 – StoryTeller