在C代码中间包含什么?

时间:2014-12-06 18:48:40

标签: c include

请, 你能告诉我下面的代码是做什么的吗?

...code...
#include file.h
...code...

我习惯把包括每个文件的开头。我以前从未见过这个,也无法在互联网上找到任何东西。

3 个答案:

答案 0 :(得分:3)

#include是一个预处理器指令,它将给定的文件作为参数并将其内容转储到当前文件中。通常,这用于包括头文件中的公共函数的定义,但是没有必要以这种方式使用它。

答案 1 :(得分:3)

它的用法不仅限于文件的启动,但请注意,即使在同一文件中,此标头中声明的变量,宏或函数在include语句之前也不可用。

答案 2 :(得分:1)

正如大家所说,#include可以在任何地方使用(前提是它在自己的逻辑线上)。在某些情况下,您希望多次#include 相同的文件。首先阅读X macro wikipage和C preprocessor wikipage。

我在MELT monitor(与MELT相关...)中有一个具体的例子。

我有一个包含类似行的predef-monimelt.h(生成的)文件
MOM_PREDEFINED_NAMED( 名称 , id , 哈希 )例如< / p>

MOM_PREDEFINED_NAMED(GET,_9dsak0qcy0v_1c5z9th7x3i,1573018885)
MOM_PREDEFINED_NAMED(HEAD,_47fatww79x6_vh8ap22c0ch,3922245622) 
MOM_PREDEFINED_NAMED(web_handler,_7sav6zery1v_24sa6jwwu6c,2339220870)
#undef MOM_PREDEFINED_NAMED

我的monimelt.h文件(一个真正的头文件)定义外部指针和一个枚举,所以特别值得注意:

// declare the predefined
#define MOM_PREDEFINED_NAMED(Name,Id,H) extern momitem_t* mom_named__##Name;
#include "predef-monimelt.h"

/// declare the hash of the predefined as an enum
#define MOM_PREDEFINED_NAMED(Name,Id,H) mom_hashname__##Name = H,
enum {
#include "predef-monimelt.h"
};

我的main.c文件特别包含例程:

  // if this routine is compiled, we are sure that all predefined hashes
  // are unique
  const momitem_t *
  mom_predefined_item_of_hashcode (momhash_t h) {
    switch (h) {
  #define MOM_PREDEFINED_NAMED(Nam,Id,Hash) case Hash: return mom_named__##Nam;
  #include "predef-monimelt.h"
    default:
    return NULL;
     }
  }

但我的items.c包含predef-monimelt.h个文件两次(在初始化时创建预定义项目,并定义其变量):

 void mom_create_predefined_items (void) {
   int nbnamed = 0;
 #define MOM_PREDEFINED_NAMED(Nam,Id,H) do { \
   mom_named__##Nam = mom_make_item_of_identcstr(#Id); \
   mom_named__##Nam->i_space = momspa_predefined; \
   mom_register_item_named_cstr (mom_named__##Nam, #Nam); \
   nbnamed ++; \
 } while(0);
 #include "predef-monimelt.h"
 } // end of mom_create_predefined_items

 // declare the predefined
 #define MOM_PREDEFINED_NAMED(Nam,Id,H) momitem_t* mom_named__##Nam;
 #include "predef-monimelt.h"

FWIW,MELT显示器是GPLv3 +许可软件