【发布时间】:2014-11-13 03:59:13
【问题描述】:
我有一个非常大的 Native C++ 项目,其中有数百个类,每个类都定义在自己的 .cpp 和 .h 文件中。这里没有什么奇怪的。我在预编译的头文件 stdafx.h 文件中声明了所有类,并且还包含在 stdafx.h 文件中,如下所示(以允许 Foo 引用 Bar 和 Bar 引用 Foo)。
这个组织是不好的做法吗?
基本上,所有类都被声明并包含在每个对象中。我假设编译器不会通过包含编译特定 .cpp 目标文件所不需要的东西来生成开销二进制文件。到目前为止,我的编译时间也没有任何问题。我只是想知道这是否是一个糟糕的代码组织。
我喜欢这种布局,因为 stdafx.h 文件本质上是一个代码映射,因为所有类都在此处声明,并且它表明嵌套命名空间是一种易于阅读的格式。这也意味着我的单个类 .h 文件不需要多个包含语句,这意味着我在更改文件名或目录时需要维护的代码更少。
stdafx.h:
#pragma once
namespace MyProject
{
class Foo;
class Bar;
}
#include "Foo.h"
#include "Bar.h"
foo.h:
#pragma once
namespace MyProject
{
class Foo
{
// Declare class members, methods, etc
}
}
foo.cpp:
#include "stdafx.h"
namespace MyProject
{
class Foo
{
// Define class members, methods, etc
}
}
【问题讨论】:
-
不,它只是无法编译。您是否忘记了包含守卫?
-
但是现在你必须在每次添加或删除一个类时更新stdafx.h(这意味着重新编译整个项目),并且至少你的一些类不会在上下文之外编译一个项目的 stdafx,因为他们没有转发声明他们需要的东西。
-
啊在每个标题上添加一个
#pragma once。 -
是的,组织不好。预编译头文件用于加快编译时间。您至少必须在餐巾纸的背面计算标题很少更改并且只包括那些。只需将所有内容都包含在预编译的标头中,您就可以获得完全 0 的性能。
-
困扰我的是
stdafx.h包含Foo.h,而Foo.h包含stdafx.h。这对我来说看起来不太好。 (据我了解,stdafx.h应该不包含在其他标题中;只能包含在源文件中。)
标签: c++ c++11 visual-studio-2013 native