c++ - 包含顺序和隐藏的依赖关系

标签 c++ include dependencies

在寻找有关包含顺序的最佳实践时,我被这个线程绊倒了:

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

@squelart 指出,从本地到全局包含更好的做法,因为这减少了隐藏依赖项的机会。我刚刚使用以下代码在 VS2015 项目中对此进行了测试:

StrTest.h

#pragma once

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

        std::string test;
};

StrTest.cpp

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


CStrTest::CStrTest()
{
}

CStrTest::~CStrTest()
{
}

我无法重现所述行为(隐藏的依赖二重奏,包括 StrTest.cpp 中的字符串优先)。编译器给我多个错误。那么这是过去的事情还是我忽略了什么?

编辑:VS2015 编译器错误:

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

Error C2039 'string': 不是 'std' 的成员

错误 C3646“测试”:未知的覆盖说明符

最佳答案

So is this something out of the past

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

The compiler gives me mulitple errors.

虽然“隐式”包含是一种糟糕的风格,但就标准而言,它在技术上仍然是良好的格式,只要保证隐式包含的文件被您或编写包含它的 header 的任何人包含 - 标准标题没有这样的保证。

因此,我反对将隐式包含视为错误的编译器功能。明确启用的警告会更合适。

关于c++ - 包含顺序和隐藏的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44257618/

相关文章:

c - 为什么有时在代码块中编写 include 语句是有效的?

java - 如果一个类调用另一个类,我可以将它们放在单独的 JAR 文件中吗?

ruby-on-rails - 如何从 Rails LEFT OUTER JOIN 访问连接记录

c++ - 如何使用 unordered_multimap 在模板类方法中执行 make_pair?

c++ - boost ,以分钟为单位获得UTC时间

c++ - 静态初始化的反义词是什么?

c++ - "template argument deduction/substitution failed"带有参数包的函数对象错误

dependencies - 当依赖关系发生变化时,依赖反转主体 (DIP) 如何减少对依赖模块进行更改的需要?

java - 在 Gradle 项目中使用 Kotlin 进行 Stripe 集成

dependencies - 解决依赖关系是什么?