可能重复:
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>
现在按字母排序。
我找到了订购它们的最佳做法。 (有一个很好的公式?)
您如何订购这些头文件?为什么?
答案 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,否则在编译时很可能会出现链接器错误。
祝你好运!答案 3 :(得分:1)
标准库,然后系统头不在标准库中,然后是私有头。用空行分隔每个类别。评论任何需要解释的内容。
如果您有依赖项,请在依赖它们的标题之前包含标题所依赖的依赖项(doi!)。