限制#include指令的范围

Max*_*xpm 2 c++ scope include c-preprocessor

假设我有一个带有使用类的头文件std::string.

#include <string>

class Foo
{
     std::string Bar;

     public:

     // ...
}
Run Code Online (Sandbox Code Playgroud)

此头文件的用户可能不希望std::string包含在他/她的项目中.那么,如何将包含限制为头文件呢?

Oli*_*rth 11

你的类的用户必须包含<string>,否则他们的编译器将不知道Foo对象有多大(如果Foo构造函数/析构函数是内联定义的,那么编译器也不会知道为string成员调用什么构造函数/析构函数).

这确实是C++编译模型的一个令人恼火的副作用(基本上是从C完整地继承).如果你想完全避免这种事情,你可能想看看PIMPL习语.

  • 对于任何贬低的人 - 这似乎是一个非常合理的答案.你有什么不同意的吗? (2认同)
  • @ diverscuba23-在这种情况下,如果`std :: string`是直接数据成员,则需要头文件,因为编译器需要知道对象的大小.如果您只需要将类型作为函数参数,或者只是使用指向它的指针,则可以不包括文件,但在此特定实例中,您必须*包含标头或代码将无法编译. (2认同)

Jam*_*lis 5

基本上,你没有.一旦包含文件,该文件中的所有实体都可用于翻译单元的其余部分.

隐藏这种依赖性的惯用方法是依赖于pimpl习语.

那说,为什么编码使用包含的Foo护理<string>?它的所有实体都在std命名空间中(除了<string>可能包含一些C标准库头文件之外,通常你应该编写代码,期望任何C++标准库头文件都可以包含C标准库头文件).