我有许多.c
个文件,即实施文件说
来自任何文件的函数可以从不同的文件中调用任何函数。我的问题是,我是否需要一个.h
头文件用于A和B的每个实现,其中每个头文件都有 ALL 定义A或B中的函数。
另外,main.c中会同时包含A.h
和B.h #included
吗?
如果有人最终能说清楚,那么我如何在以后编译并运行终端中的多个文件。
感谢。
答案 0 :(得分:21)
A.h
的标头A.c
应仅包含使用A.c
中定义的设施的外部代码所必需的信息。它不应该声明静态函数;它不应该声明静态变量;它不应声明内部类型(仅在A.c
中使用的类型)。它应确保文件只能使用#include "A.h"
,然后充分利用A.c
发布的工具。它应该是自包含的和幂等的(因此您可以包含它两次而不会出现任何编译错误)。您可以通过将#include "A.h"
写为#include
中的第一个A.c
行来检查标头是否为自包含状态;你可以通过两次包含它来检查它是幂等的(但最好将它作为一个单独的测试来完成)。如果它不编译,则不是自包含的。同样适用于B.h
和B.c
。
有关标头和标准的详细信息,请参阅参考NASA编码标准的“Should I use #include
in headers?”和“Linking against a static library”,其中包含我用于测试的脚本chkhdr
自我遏制和幂等性。
请注意,main.o
取决于main.c
,A.h
和B.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
答案 1 :(得分:3)
如果另一个.c
文件中需要.c
文件中声明的内容,则必须提供头文件。
一般来说,您可以为每个源文件都有一个头文件,您可以在其中导出所有已声明的函数或extern
符号。
在实践中,您不会总是需要导出每个函数或每个变量,只需要导出另一个源文件所需的变量,并且您需要将其包含在所需的文件中(并且在源中与特定的头文件)。
当试图理解它是如何工作时只考虑每个源文件都是自己编译的事实,所以如果它将使用未在其源文件中直接声明的东西,那么它必须通过头文件声明文件。通过这种方式,编译器可以知道所有内容都存在且输入正确。
答案 2 :(得分:3)
这取决于编译器,但假设你使用的是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
答案 3 :(得分:0)
您要使用
gcc -g *.c -lm
它可以节省键入内容,并允许您链接项目中的所有c文件。