私のコードでは、OpenSSLヘッダーを次のような名前空間に取り込みます。
#include <cstdio>
namespace OpenSSL {
#include <openssl/ssl.h>
#include <openssl/err.h>
}
しかし、OpenSSLをサポートしているBoost ASIOを使用しているときに、これを実行しようとすると、爆発が発生する可能性があることを発見しましたが、OpenSSLシンボルをグローバル名前空間に取り込むように見えます。これについて何かできることはありますか、それともグローバル名前空間にすべてのOpenSSLライブラリのシンボルを残す必要がありますか?
ヘッダーを含めた後、問題のあるファイルで「using namespace OpenSSL」を試すことを考えましたが、残念ながら次のようなエラーが発生します。
/usr/include/openssl/x509v3.h:83:13: error: reference to ‘v3_ext_ctx’ is ambiguous
/usr/include/openssl/x509v3.h:71:8: error: candidates are: struct v3_ext_ctx
/usr/include/openssl/ossl_typ.h:160:16: error: struct OpenSSL::v3_ext_ctx
(OpenSSLはC ++ライブラリではなくCライブラリであるため、元の関数はC ++コンパイルユニットに取り込まれるまで名前空間に存在しないことに注意してください。私の手法は、Stroustrupの著書The C ++ Programming Language、 SpecialEditionで推奨されています。セクション9.5「アドバイス」から:「[8] #グローバル名を避けるために名前空間にCヘッダーを含める;§8.2.9.1、§9.2.2。」