最近我一直在使用 TIVA C 系列启动板,该板带有 Cortex-M4 芯片。我使用 Code Composer Studio 作为我的 IDE。
现在存在很多困惑,因为通过反复试验,我发现为了使用芯片制造商提供的某些功能,我需要包含 .c 文件而不是包含 .h 文件。
这让我措手不及,我承认我不是一个专业的程序员,也不是编译器设计方面的专家。但是有人知道为什么编译器需要 .c 文件而不是 .h 文件吗?
.h 文件仍在使用中,因为它包含 .c 文件所需的定义。
也许更好的问题是这样的:
当存在 .h 文件和 .c 文件时,您的代码中包含 .c 文件还是包含 .h 文件?
我的反复试验告诉我,您必须包含 .c 文件,但我完全不知道实际规则是什么。
如果其中任何部分过于模糊,我们深表歉意。我完全可以共享我的 main.c 文件,这样您就可以看到我如何包含这些文件,但我觉得我的问题更多的是关于当同时存在 .h 和 a 时包含文件的一般规则是什么的问题.c 文件。
感谢您花时间帮助我理解这个问题。
编辑:为什么投反对票?我以为来这里寻求帮助就是这个地方的意义吗?
最佳答案
重要的是要理解,基本上所有 C 程序都是从多个源文件构建的。在某些情况下,许多源代码被预编译到一个或多个库中,但构建 C 程序通常还涉及构建多个 C 源文件并将它们相互链接并链接到适当的库以生成最终结果.
了解这一点也很重要:虽然 C 允许函数和文件范围变量的多个兼容声明,但它只允许在任何地方对每个不同的函数或变量有一个定义在整个程序中。这是将声明放入头文件(通常以 .h
扩展名命名)的惯例的主要原因。任意数量的为给定程序做出贡献的源文件都可以#include
相同的头文件,但最多其中一个可以#include
包含相应定义的源文件,然后仅当该文件未直接包含在构建中时。
可以编写主源文件,使其#include
成为直接包含所有所需定义的.c
文件,在这种情况下,它不是包含 header 是必要的,但是如果产生重复的函数定义,则不能让两个单独的源文件对同一个程序做出贡献。最终,这种方法也可能会失败,因为给定编译器可以管理的源文件的大小和复杂程度可能受到限制。
如果芯片制造商的 C 源文件附带有头文件,那么您自己的源文件应该只包含这些头文件。您应该能够从这些来源构建目标文件。然而,要构建可执行程序,您还必须构建芯片制造商的 C 源代码,并将它们链接到您自己的源代码。创建一个包含芯片制造商源代码的库并将其链接起来是明智的做法,但也可以直接为每个程序构建所需的源文件。您的 IDE 应该支持这两个选项。
关于关于包含 .c 和 .h 文件的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38793117/