我试图了解何时应该使用预处理器#ifndef。 我做的项目有: a.h,a.c
b.h,b.c
我在main.c中包含b.h和a.h
因此,如果我需要包含例如windows.h和string.h,我是否需要在a.h和b.h中执行此操作?(如果它们的源文件都需要使用这些头文件中的函数) 如果我在两个文件中包含相同的多头文件(如果我有多个标题而不仅仅是那两个),它会慢吗? 非常感谢您的帮助! :)
答案 0 :(得分:2)
头文件包含声明(命名的东西)和源文件(.c)包含定义(实际的东西)
无论何时使用其他地方定义的东西(变量,函数),都必须声明一次。
类型定义/声明也是如此。
因此,对于您的问题:如果在头文件(a.h)中使用类型(来自b.h),则必须在头文件a.h中#include相应的头文件b.h.如果你在源文件d.c中使用了一个函数,它在x.h中声明(并在源文件x.c中的某个地方定义),你必须在d.c中包含x.h。
现在为#ifndef里面的头文件:这些是守卫。记住:我说过#34;一次"。因此,您必须多次保护头文件不被读取。这是由
完成的#ifndef __A_H_INCLUDED__
#define __A_H_INCLUDED__
//here your stuff comes
#endif
因此您可以多次在构建树中包含a.h
以此作为经验法则:如果您需要在文件(标头或源代码)内部声明事物,那么在这个文件的顶部包含相应的头文件是明智的。
编辑:如果这些声明只在一个源文件中使用(如静态函数或本地类型和变量),则不必在头文件中放置声明。
EDITH:
windows.h
typedef WINWORD long;
void windowFunction(WINWORD w);
myheader_a.h
#include <windows.h> // WINWORD
void mySillyWinFunction(WINWORD w);
mysource_a.c
#include <myheader_a.h>
void mySillyWinFunction(WINWORD w) {
windowFunction(w);
}
mysource_b.c
#include <myheader_a.h>
/* call */
mySillyWinFunction(w);