2017-05-30 103 views
1

在查找关于最佳pratices包括订单,我被绊倒这个线程:包括订单和隐藏的依赖

C/C++ include file order/best practices [closed]

@squelart中指出,这是更好的初步实践从地方到全球,包括,因为这减少了隐藏依赖的机会。

StrTest.h

#pragma once 

class CStrTest 
{ 
    public: 
     CStrTest(); 
     ~CStrTest(); 

     std::string test; 
}; 

StrTest.cpp

#include <string> 
#include "StrTest.h" 


CStrTest::CStrTest() 
{ 
} 

CStrTest::~CStrTest() 
{ 
} 

我无法重现陈述行为(隐藏dependencie二人包括:刚才我用下面的代码测试这个在VS2015项目字符串首先在StrTest.cpp中)。编译器给我多个错误。那么这是过去的事情,还是我忽略了一些东西?

编辑:VS2015编译器错误:

错误C4430缺少类型说明符 - 假定为int。注意:C++不支持默认int

错误C2039 '串':是不是 'STD' 的成员

错误C3646 '测试':未知覆盖符

+0

现在还不清楚你在这里问什么 - 上面的代码编译。 –

+1

你实际上是在做什么squelart回答表明相反。 – VTT

+1

您还需要包括或至少向前声明中''StrTest.h'的std :: string'。你的头文件应该是自包含的。 – juanchopanza

回答

1

所以这事过去的

不,隐藏的依赖关系是标准行为,并且在现代编译器中发生。我不知道VS的,但GCC和Clang的根本编译出的程序没有任何错误。演示:https://wandbox.org/permlink/ATJndwrOwirpDgDd

编译器给我多重错误。

尽管“隐”包括是作风不好,它仍然是技术上以及形成至于标准而言,只要隐含文件是保证或将被包括在由你谁写,包括头它 - 标准头文件没有这样的保证。

因此,我将针对这样的编译器的功能,考虑了隐式包括为错误。明确启用警告会更合适。

+0

谢谢,我没有与其他编译器进行测试。有趣的是,这与GCC和Clang一起工作。 – YokeM

0

我想讨论的隐藏的依赖问题的点存在,通常每个文件包含其他一些文件,如果头是不是自包含的,然后包括它的情况下可以正常工作时,它的隐含相关性是由其他一些标题和突破包括所有其他标题更改和/或移动/删除时的所有内容。简而言之:使用隐藏依赖的头部会导致非常脆弱的代码。

// foo.hpp 
#pragma once 

#include <string> // if we remove this unrelated `StrTest.h` header will be broken 
... 

// main.cpp 

#include "foo.hpp" // if we move this one line lower `StrTest.h` header will be broken 
#include "StrTest.h" // accidentally works fine 
...