Importing C header files question about what is included

问题描述 投票:0回答:2

我对头文件有点困惑。

我对C的头文件的理解,比如

#include <windows.h>
,是根据程序中使用的函数,只包含必要的部分。例如,如果在源代码中只实现了
MessageBox()
功能,那么头文件中只包含必要的部分。

但是,我在 GitHub here 上偶然发现了 WindowsHModular,它声称允许程序员只包含所需的内容,因为 GitHub 作者已将

Windows.h
拆分为各种模块。

这似乎很矛盾,所以我希望有人能帮我弄清楚我的事实。

c winapi compilation linker header-files
2个回答
1
投票

不,

如果你包括文件行

#include <file.h> // or "file.h"

替换为

file.h

的内容

示例:https://godbolt.org/z/a3WEP6hdP

头文件不是库或目标文件。当您链接时,链接器将仅链接使用过的函数(更准确地说是使用过的段中的所有函数)。


1
投票

我对C头文件的理解,比如#include ,是根据程序中使用的函数,只包含必要的部分。

我想这取决于你所说的“包括”是什么意思。可能您将标头包含与链接混淆了,这是编译过程后期完全独立的阶段。

在高层次上,

#include
指令很简单。它们指示编译器从另一个文件中读取源代码,就好像它出现在指令的位置一样。就是这样。没有固有的挑选和选择不同的作品。考虑一下:编译器在处理源文件的其余部分之前如何知道您需要哪些部分?

头文件和“常规”源文件之间没有根本区别,但是只有某些类型的代码会被放入头文件中,这已成为传统智慧和非常强烈的习惯,主要是:

  • 函数声明
  • 宏定义
  • struct
    union
    enum
    类型定义
  • 外部变量声明
  • typedef
    定义

这些大多是需要在多个独立的源文件中以相同方式声明的东西,将它们放在头文件中既方便了这一点,也使其中一个需要更改时的维护变得容易得多。

这些也是不使用时不会影响程序的东西。例如,如果源代码声明了它从不调用的函数,无论是通过

#include
头文件还是直接声明它们,最终的程序都不会更大或更复杂。

但是,我在这里偶然发现了 GitHub 上的 WindowsHModular,它声称允许程序员仅包含所需的内容,因为 GitHub 作者已将

Windows.h
拆分为各种模块。

Windows.h
的问题在于它庞大而复杂。虽然这对编译程序没有影响,但它确实使编译器花费相当多的精力。将
Windows.h
拆分为单独的模块的目的是通过允许您省略一堆您根本不需要的声明来减少编译程序所需的 CPU 时间和内存。

此时您最好忽略 WindowsHModular。

© www.soinside.com 2019 - 2024. All rights reserved.