【发布时间】:2012-08-01 07:34:53
【问题描述】:
在我的代码中,我将 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 在他的书The C++ 中推荐了我的技术编程语言,特别版。来自第 9.5 节,“建议”:“[8] #include 命名空间中的 C 标头以避免全局名称;§8.2.9.1,§9.2.2。 "
【问题讨论】:
-
您能详细说明一下那些“爆炸物”吗?我能够创建的一个非常短的示例似乎编译得很好,但也许我遗漏了一些东西。
-
如果在 C++ 文件中包含上述文件,后跟“#include
”,您会看到问题。产生的错误信息很多,具体的设置取决于上面的头文件是包含在asio之前还是之后。如果您在重现问题时遇到问题,请随时直接给我发电子邮件(我的地址在我的用户页面上)。 -
我假设你的意思是 8.2.9(没有 8.9.2)但它没有这么说。
标签: c++ namespaces