c – 如何避免#include对外部库的依赖
发布时间:2020-12-16 04:59:12 所属栏目:百科 来源:网络整理
导读:如果我正在创建一个带有头文件的静态库,例如: // Myfile.h#include "SomeHeaderFile.h" // External libraryClass MyClass{// My code}; 在我自己的项目中,我可以告诉编译器(在我的情况下,Visual Studio)在哪里寻找SomeHeaderFile.h.然而,我不希望我的用户
如果我正在创建一个带有头文件的静态库,例如:
// Myfile.h #include "SomeHeaderFile.h" // External library Class MyClass { // My code }; 在我自己的项目中,我可以告诉编译器(在我的情况下,Visual Studio)在哪里寻找SomeHeaderFile.h.然而,我不希望我的用户关心这一点 – 他们应该能够包含我的标题,而不必通知他们的编译器SomeHeaderFile.h的位置. 这种情况如何正常处理? 解决方法
这是一个经典的“编译防火墙”场景.有两个简单的解决方案可以做:
>从外部库转发声明所需的任何类或函数.然后将外部库的头文件仅包含在您的cpp文件中(当您实际需要使用您的头文件中转发的类或函数时). 以下是使用第一个选项的示例: #ifndef MY_LIB_MY_HEADER_H #define MY_LIB_MY_HEADER_H class some_external_class; // forward-declare external dependency. class my_class { public: // ... void someFunction(some_external_class& aRef); // declare members using the forward-declared incomplete type. }; #endif // in the cpp file: #include "my_header.h" #include "some_external_header.h" void my_class::someFunction(some_external_class& aRef) { // here,you can use all that you want from some_external_class. }; 以下是选项2的示例: #ifndef MY_LIB_MY_HEADER_H #define MY_LIB_MY_HEADER_H class my_class_impl; // forward-declare private "implementation" class. class my_class { private: std::unique_ptr<my_class_impl> pimpl; // a vanishing facade... public: // ... }; #endif // in the cpp file: #include "my_header.h" #include "some_external_header.h" class my_class_impl { private: some_external_class obj; // ... public: // some functions ... }; my_class::my_class() : pimpl(new my_class_impl()) { }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |