C倍数包括

时间:2014-07-19 08:17:34

标签: c include

我试图了解何时应该使用预处理器#ifndef。 我做的项目有: a.h,a.c

b.h,b.c

我在main.c中包含b.h和a.h

因此,如果我需要包含例如windows.h和string.h,我是否需要在a.h和b.h中执行此操作?(如果它们的源文件都需要使用这些头文件中的函数) 如果我在两个文件中包含相同的多头文件(如果我有多个标题而不仅仅是那两个),它会慢吗? 非常感谢您的帮助! :)

1 个答案:

答案 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);
相关问题