oro*_*rod 7 c++ header class include precompiled
我是编程的新手,头文件的主题在我开始使用它们之后会让我失望.除此之外,我正在尝试使用预编译的头文件.我也在使用SFML库,所以我必须包含那些标题.
现在我有stdafx.h,main.cpp,然后是Ah,A.cpp,Bh,B.cpp,Ch,C.cpp,Dh和D.cpp中包含的类A,B,C和D.
如果包含所有文件中的标题,我将采用什么顺序?
stdafx.h中:
#include <SFML/Graphics.hpp>
#include <iostream>
Run Code Online (Sandbox Code Playgroud)
啊
#include "stdafx.h"
class A
{
//sfml class
};
Run Code Online (Sandbox Code Playgroud)
A.cpp
#include "stdafx.h"
#include "A.h"
Run Code Online (Sandbox Code Playgroud)
BH
#include "stdafx.h"
class B
{
//sfml class
};
Run Code Online (Sandbox Code Playgroud)
B.cpp
#include "stdafx.h"
#include "B.h"
Run Code Online (Sandbox Code Playgroud)
章
#include "B.h"
class C: public B
{
};
Run Code Online (Sandbox Code Playgroud)
C.cpp
#include "stdafx.h"
#include "C.h"
Run Code Online (Sandbox Code Playgroud)
DH
#include "A.h"
#include "C.h"
class D
{
A a;
C C; // if left uncommented I recieve a '1 unresolved externals' error
//sfml class
}
Run Code Online (Sandbox Code Playgroud)
D.cpp
#include "stdafx.h"
#include "D.h"
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "stdafx.h"
#include "D.h"
Run Code Online (Sandbox Code Playgroud)
Qwe*_*tie 10
我的理念是,在编写良好的代码中,头文件应该包含它们所依赖的所有其他头文件.我的理由是,不应该包含头文件并且因为这样做而得到编译器错误.因此,每个头文件应该(在包括后面#ifdef或#pragma once 包括后卫)包括它依赖的所有其他头.
为了非正式地测试你记得在头文件中包含正确的标题,*.cpp文件应该#include应该有效的最小头文件集.因此,如果有单独的头文件A,B,C和D,你的CPP文件使用类D,那么它应该只包括迪拉姆.不会产生编译器错误,因为Dh #include s Ah和Ch,Ch包括Bh,而Ah和Bh包括SFML头(无论是什么).如果看起来合适,Ch和Dh可以包括SFML头,但是如果可以确定依赖关系(Bh和Ah)已经包含它,那么它并不是必需的.
但是,Visual C++执行"预编译头"的方式搞砸了这种逻辑.它要求您包含"StdAfx.h"作为第一个头文件,这会导致许多开发人员简单地将所有#includes放在StdAfx.h中的整个项目中,而不是#include在任何其他头文件中使用.我不推荐这个.或者,它们将所有外部依赖项放在StdAfx.h中(例如,windows.h,boost标头)和#include其他地方的本地依赖项,以便更改单个头文件不一定会导致整个项目重建.
我编写代码的方式,我的大多数CPP文件包括StdAfx.h和相应的.H文件.所以A.cpp包括StdAfx.h和Ah,B.cpp包括StdAfx.h和Bh,依此类推.#include放在cpp文件中的唯一其他内容是头文件未公开的"内部"依赖项.例如,如果类A调用printf(),那么A.cpp(不是啊)会#include <stdio.h>,因为Ah不依赖于stdio.h.
如果您遵循这些规则,那么#include标头的顺序无关紧要(除非您使用预编译的标头:然后预编译的标头首先出现在每个cpp文件中,但不需要包含在头文件中).
| 归档时间: |
|
| 查看次数: |
6317 次 |
| 最近记录: |