C++依赖标头排序

C++ Dependant header ordering

本文关键字:排序 依赖 C++      更新时间:2023-10-16

C++中有没有一种方法可以让人明显地看到,某些头必须按照所示的顺序排列,而重新排列它们会破坏程序?

例如:

// WARNING , THE TWO HEADERS BELOW MUST BE IN THIS ORDER EXACTLY.
    #include <winsock2.h>
    #include <windows.h>
// END WARNING.
#include <iphlpapi.h>
#include <stdio.h>
#include <stdint.h>
#pragma comment(lib, "Ws2_32.lib")

这就是我现在所拥有的,但我觉得C++应该有一个将标题分组在一起的功能,比如:

#include_order <winsock2.h, windows.h>
#include <windows.h>
#include <winsock2.h>    
#include <iphlpapi.h>
#include <stdio.h>
#include <stdint.h>
#pragma comment(lib, "Ws2_32.lib") 

这样,无论人们将来如何重新排列你的代码,只要强制执行是第一位的,代码就不会崩溃。

这对于编写预处理器来说已经足够琐碎了,但我想知道我是否可以在不编写自己的预处理器的情况下完成这项工作。

完整代码:

// WARNING , THE TWO HEADERS BELOW MUST BE IN THIS ORDER EXACTLY.
    #include <winsock2.h>
    #include <windows.h>
// END WARNING.
#include <iphlpapi.h>
#include <stdio.h>
#include <stdint.h>
#pragma comment(lib, "Ws2_32.lib")
int main()
{

    return 0;
}

处理该问题的标准方法:(WIN32_EAN_AND_MEAN似乎用词不当)

/* this definition must precede any includes. */
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdint.h>
#pragma comment(lib, "Ws2_32.lib")
int main()
{

    return 0;
}

解决这一问题的经得起未来考验的方法是,如果您使用的是visualstudio:

属性=>C/C++=>预处理器=>定义=>WIN32_EAN_AND_MEAN

它将为您的整个项目全局定义WIN32_LEAN_AND_MEAN。如果您不使用visualstudio,请在IDE中找到允许您执行相同操作的设置。

您也可以通过使用预编译的标头来解决此问题。如果在那里定义WIN32_LEAN_AND_MEAN,则是安全的,因为在预编译头之前不能包含任何头。

如果有人修改了预编译的头,并想知道为什么整个项目不再编译,那么我相信他们会知道该去哪里找。此外,您还可以在那里添加一条大大的评论