csc*_*hol 35
您应该将.h文件视为.c文件的接口文件.每个.c文件代表一个具有一定功能的模块.如果.c文件中的函数被其他模块(即其他.c文件)使用,则将函数原型放在.h接口文件中.通过将接口文件包含在原始模块.c文件和其他所有.c文件中,您需要使用该功能,您可以将此功能用于其他模块.
如果您只需要某个.c文件中的函数(不在任何其他模块中),请将其范围声明为static.这意味着它只能从定义的c文件中调用.
对于跨多个模块使用的变量也是如此.它们应该放在头文件中,并且必须用关键字'extern'标记.注意:对于函数,关键字"extern"是可选的.功能始终被视为"外部".
头文件中的包含保护有助于不多次包含相同的头文件.
例如:
Module1.c:
#include "Module1.h"
static void MyLocalFunction(void);
static unsigned int MyLocalVariable;
unsigned int MyExternVariable;
void MyExternFunction(void)
{
MyLocalVariable = 1u;
/* Do something */
MyLocalFunction();
}
static void MyLocalFunction(void)
{
/* Do something */
MyExternVariable = 2u;
}
Module1.h:
#ifndef __MODULE1.H
#define __MODULE1.H
extern unsigned int MyExternVariable;
void MyExternFunction(void);
#endif
Module2.c
#include "Module.1.h"
static void MyLocalFunction(void);
static void MyLocalFunction(void)
{
MyExternVariable = 1u;
MyExternFunction();
}
And*_*rew 10
尝试使每个.c专注于特定的功能区域.使用相应的.h文件来声明这些函数.
每个.h文件都应该有一个"标题"保护它的内容.例如:
#ifndef ACCOUNTS_H
#define ACCOUNTS_H
....
#endif
Run Code Online (Sandbox Code Playgroud)
这样你可以根据需要多次包含"accounts.h",并且第一次在特定的编译单元中看到它将是唯一真正吸引其内容的人.
一些简单的规则要开始:
您可以在此主题中看到C'模块的示例- 请注意,有两个文件 - 标题tea.h和代码tea.c. 您声明了其他程序要在标头中访问的所有公共定义,变量和函数原型.在您的主项目中,您将#include,并且该代码现在可以访问标题中提到的茶模块的函数和变量.
之后它会变得更加复杂.如果您正在使用Visual Studio和许多其他IDE来管理您的构建,那么请忽略这一部分 - 它们负责编译和链接对象.
编译两个单独的C文件时,编译器会生成单独的目标文件 - 因此main.c变为main.o,而tea.c变为tea.o. 链接器的工作是查看所有目标文件(你的main.o和tea.o),并匹配引用 - 所以当你在main中调用tea函数时,链接器会修改该调用,所以它实际上调用了右边的在茶中的功能.链接器生成可执行文件.
有一个很好的教程可以更深入地讨论这个主题,包括你将遇到的范围和其他问题.
祝好运!
-亚当