在我的代码中,我使用命名空间引入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++编译单元之前不属于任何命名空间。斯特劳斯特鲁普在他的书《C++程序设计语言》特别版中推荐了我的技术。从第9.5节“建议”中可以看到:“[8] 在命名空间中包含C头文件以避免全局名称; §8.2.9.1, §9.2.2。”