在我的代码中,我将 OpenSSL 标头放入命名空间中,如下所示:
#include <cstdio>
namespace OpenSSL {
#include <openssl/ssl.h>
#include <openssl/err.h>
}
但是我刚刚发现,如果我在使用具有 OpenSSL 支持但似乎将 OpenSSL 符号带入全局命名空间的 Boost ASIO 时尝试这样做,这似乎会导致事情爆炸。对此我能做些什么,还是我只需将所有 OpenSSL 库的符号留在全局命名空间中?
在包含我的标头后,我确实想过在有问题的文件中尝试“使用命名空间 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 在他的《C++ 编程语言,特别版》一书中推荐了我的技术。来自第 9.5 节,“建议”:“[8] #include C headers in namespaces to avoid global names;§8.2.9.1, §9.2.2。”