头文件顺序

时间:2011-01-26 02:43:12

标签: c++ c windows dependencies header-files

  

可能重复:
  C++ Header order

// Here is module This.cpp
#include <boost/regex.hpp>
#include <iostream>
#include <math.h>
#include "mystring_written_by_c.h"
#include "mystring_written_by_cpp.h"
#include <list>
#include <string>
#include <stdio.h>
#include "stdafx.h" // for precomp
#include <tchar.h>
#include "This.h"
#include <Windows.h>
#include <Winsock2.h>

现在按字母排序。
我找到了订购它们的最佳做法。 (有一个很好的公式?)

您如何订购这些头文件?为什么?

4 个答案:

答案 0 :(得分:5)

标题应尽可能地写入1)独立于已经包含的内容,以及2)不为后面包含的标题引入问题(例如公共标识符的宏)。当这两个都为真时,您包含的顺序无关紧要。如果不是这样,您应该在自己的标题中修复它,或者在必要时处理它。

因此,选择是随意的,但您做出选择仍然很重要! “计划不算什么,但计划就是一切。”一致性导致更易读的代码。

一个相对常见的顺序是标准库,系统(如在OS中),外部库,然后是与当前文件相同的项目的标题 - 除了包含其“对应”标题的实现文件(如果有)首先,在任何包含或其他代码之前。在每个组中,我按习惯按字母顺序排序,因为它再次完全是任意的,但是一些易于使用的顺序让我可以快速阅读和更新列表。

应用于您的列表:

// first only because this is required in your precompiled header setup
#include "stdafx.h"

// it's too bad this can't really be first
// I'm guessing "This" refers to the corresponding header
#include "This.h"

// C stdlib then C++ stdlib is what I usually do,
// whether the C headers are spelled XXX.h or cXXX.
#include <math.h>
#include <stdio.h>
#include <iostream>
#include <list>
#include <string>

// someone mentioned winsock2 needs to be before windows
#include <Winsock2.h>

#include <tchar.h>
#include <Windows.h>

#include <boost/regex.hpp>

#include "mystring_written_by_c.h"
#include "mystring_written_by_cpp.h"

上面划分为分组的行是故意的。我会留下评论为什么winsock2被赋予自己的组,但其余的评论通常不会出现。

答案 1 :(得分:2)

放置头文件的顺序并不重要。这主要是一个选择问题。许多人首先将系统标题(介于&lt;&gt;之间的标题)和私有标题放在首位,但这取决于您。

答案 2 :(得分:2)

它高度依赖于如何您需要它们。如果没有一个依赖于另一个,你可以相对自由地使用自己的方案(一般来说,如果另一个人需要,将隐式包含最重要的头文件)。

但请注意,在Windows.h之前必须包含WinSock2.h,否则在编译时很可能会出现链接器错误。

祝你好运!
丹尼斯M。

答案 3 :(得分:1)

标准库,然后系统头不在标准库中,然后是私有头。用空行分隔每个类别。评论任何需要解释的内容。

如果您有依赖项,请在依赖它们的标题之前包含标题所依赖的依赖项(doi!)。