14

我有很多.c文件,即实现文件说

  • 主程序
  • 交流电
  • 公元前

任何文件中的函数都可以调用不同文件中的任何函数。我的问题是,我是否需要.h为 A 和 B 的每个实现提供一个 ie 头文件,其中每个头文件都定义了 A 或 B 中的所有函数。

另外, main.c 将同时包含A.hB.h #included吗?

如果有人终于可以说清楚,我以后如何在终端中编译和运行多个文件。

谢谢。

4

4 回答 4

25

标题内容

A.h的标头A.c应仅包含使用 中定义的设施的外部代码所必需的信息A.c。它不应该声明静态函数;它不应该声明静态变量;它不应声明内部类型(仅在 中使用的类型A.c)。它应该确保一个文件可以使用#include "A.h",然后充分利用A.c. 它应该是独立的、幂等的(因此您可以包含它两次而不会出现任何编译错误)并且最小化。您可以简单地检查标题是自包含的,#include "A.h"方法是#includeA.c; 您可以通过两次包含它来检查它是否是幂等的(但最好作为单独的测试完成)。如果它不编译,它就不是自包含的。同样对于B.hB.c

有关标头和标准的更多信息,请参阅“我应该#include在标头中使用吗?',它引用了 NASA 编码标准,以及 ' Linking against a static librarychkhdr ',其中包括我用来测试自包含性和幂等性的脚本。

链接

请注意,main.o取决于main.c,A.hB.h, 但main.c它本身不依赖于标头。

在编译方面,您可以使用:

gcc -o program main.c A.c B.c

如果您需要其他选项,请添加它们(开头的大多数标志;最后的库,在源代码之后)。您还可以将每个文件分别编译为目标代码,然后将目标文件链接在一起:

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o program main.o A.o B.o
于 2013-03-25T18:51:43.553 回答
4

.c仅当一个文件中声明的内容在另一个文件中需要时,您必须提供一个头.c文件。

一般来说,您可以为每个源文件都有一个头文件,您可以在其中导出所有声明的函数或extern符号。

在实践中,您并不总是需要导出每个函数或每个变量,只需要导出另一个源文件所需的那个,您只需将其包含在所需文件中(并且在与特定头文件配对的源中)。

当试图理解它是如何工作的时,想想每个源文件都是独立编译的,所以如果它要使用没有在源文件中直接声明的东西,那么它必须通过头文件来声明。通过这种方式,编译器可以知道一切都存在并且类型正确。

于 2013-03-25T18:51:05.963 回答
4

这取决于编译器,但假设您使用的是 gcc,您可以使用如下内容:

gcc -Wall main.c A.c B.c -o myoutput

查看http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html(第一个谷歌答案)了解更多详情。您可以将其编译成多个目标文件/库:

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o mybin main.o A.o B.o
于 2013-03-25T18:52:19.607 回答
1

你想用

gcc -g *.c -lm

它节省了输入,并允许您链接项目中的所有 c 文件。

于 2020-08-14T05:21:52.063 回答