2011-05-27 56 views
7

我发现自己最近对Win32做了更多的C/C++代码,并且来自C#背景我已经开发出对完全一致的“干净代码”的痴迷,所以从美丽的System。*命名空间退出到构成Win32 API头文件的#定义的混乱是一种文化冲击。重新创建Win32头文件是一个好主意吗?

通过阅读MSDN的核心Win32函数的字母顺序列表,我意识到Win32的API设计实际上是多么简单,不幸的是,它被过去25年的所有东西所笼罩,包括许多对16位编程的引用在今天的64位世界中完全无关紧要。

我很快就要开始一个新的C/C++项目,并且我正在考虑如何根据需要重新创建Win32的头文件。我可以将它设计得很漂亮,但它仍然保持与现有程序的100%二进制(和源)兼容性(因为#defines最终解决了同样的问题)。

我想知道过去有没有人尝试过(谷歌什么都没有发现),或者如果有人想阻止我这样做。

我想到的另一件事是,如果使用更干净的C Win32 API,可以设计更清洁,更易于使用的C++ Win32 API封装,因为不会有任何来自旧C的命名空间污染Win32项目。

编辑:

只是为了澄清,我不是这样做是为了提高编译性能或任何种类的优化,我充分认识到编译器摒弃了未使用的一切。我在这里的任务是有一个Win32头文件库,很高兴与之合作(因为我不需要每次使用函数时都要压低Caps-Lock)。

+1

也许你可以在这里给出一个或两个函数的例子。这听起来更像是你打算写一个本质上薄的包装库作为一种便利 - 从某种意义上说,这与ATL或MFC所做的并没有什么不同(甚至是窗口自己的,它包含了SendMessage和别的)。优点:做得好,它可以提高生产力并帮助避免常见的Win32 API陷阱(例如,通过注册表API获取正确的类型)。主要的缺点是,其他人看你的代码可能不知道你在做什么 - 这可能不是你的问题。 – BrendanMcK 2011-05-27 02:12:54

+0

看起来你有一个非常响亮的不! – 2011-05-27 11:16:12

回答

10

不要这样做。

这可能是可能的,但这需要很长时间,并且可能会导致微妙的错误。

但是,更重要的是,它会让你的程序完全不可能让你以外的任何人维护。

3

这样做没有意义。只是因为有更多的cruft并不意味着它被编译进二进制文件(任何未使用的文件都会被优化)。此外,在EXTREME机会之外,任何事情都会改变(我不知道,也许WM_INPUT的号码发生了变化),使用系统头文件更容易。此外,更直观的是什么?我认为#include <windows.h>#include "a-windows-of-my-own.h"更容易理解。

另外,老实说,你永远不需要甚至需要查看windows.h的内容。是的,我已经读过它了,是的,它是丑陋的罪孽,但它做到了我所需要的,我不需要去维护它。

使用真正的windows.h的唯一不足之处在于它可能会使编译速度减慢几毫秒。

+0

更像是几秒钟...每个源文件。 :-) – 2011-05-27 02:31:41

+0

@R:如果您使用预编译头文件,则不需要。 – 2011-05-27 02:33:35

3

没有。只需包含<windows.h>,并定义一些宏,如WIN32_LEAN_AND_MEAN,VC_EXTRALEAN,NOGDI,NOMINMAX等,以删除不需要/不需要的内容以加快编译时间。

3

尽管Win32头文件可能被认为是“杂乱”,但您几乎不必(或者不想)看到它们。您需要知道的所有信息都记录在Win32 SDK中。头文件的确切内容是一个实现细节。

在那里有很多东西需要耗费时间和不必要的繁琐复制,特别是关于不同版本的Win32 SDK。

我建议:

#include <windows.h> 
2

在我看来,这是不好的做法。整洁和简洁是通过尽可能遵守标准实践来实现的,并尽可能地利用平台。你需要假设微软在自己的平台上拥有最终的专业知识,其中一些方面超出了你现在所知的范围。简而言之,这是他们的产品,他们最了解。

通过滚动自己:

  • ...你从微软的API分支,所以微软再也无法通过他们的标准频道
  • 提供更新,你......你可能会引入由于错误你自己的傲慢,感觉你已经想出了一些东西,而你没有
  • ......你会浪费很多时间没有实际的好处(因为C头不会将任何开销带入编译后的二进制文件)
  • ...你最终会创建一个不太优雅的项目

最优雅的代码是一种携带更多LOC的实际程序逻辑,尽可能少地用于“家务”的LOC(即,代码与手头任务没有直接关系)。不要错过利用平台SDK头来让你的项目更加优雅。

1

这已被尝试过去。

在其include目录中,MinGW包含它自己的版本windows.h。据推测这是为了使标题与gcc一起工作。我不知道它是否可以与Microsoft编译器一起使用。