【问题标题】:C++ Dependant header orderingC++ 相关标头排序
【发布时间】:2016-04-10 04:18:12
【问题描述】:

在 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_LEAN_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;
}

【问题讨论】:

  • 您的代码不应依赖于包含标头的顺序。
  • 不应该,但是当我重新排列上面列出的这 2 个标头时,我的代码中出现了超过 100 个(准确地说是 116 个)错误。没有一个说“哦,你应该重新排列两个包含的顺序,duh”。
  • 然后修复标题,或者告诉负责他们的人来修复它们。
  • 让我打电话给微软来修复他们的标题听起来不像是解决问题的办法。现在有了一个标题命令执行器就可以解决这个问题,而无需与微软打交道。
  • 这是试图通过用比萨饼替换车轮来修复漏气的轮胎。

标签: c++


【解决方案1】:

如果您使用的是 Visual Studio,则可以解决这个问题:

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

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

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

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

【讨论】:

  • 这消除了由于强迫症而将 WIN32_LEAN_AND_MEAN 移动到包含底部的可能性,因此它解决了特定情况。尽管他们仍然可以从设置中删除 WIN32_LEAN_AND_MEAN,因为他们认为它没有任何作用,但这是另一个问题。
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2011-12-06
相关资源
最近更新 更多