C语言中代码中间的#include是什么意思?

4

请问,下面的代码是做什么用的?

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

我习惯于在每个文件的开头加入 includes。我以前从未见过这种做法,也无法在互联网上找到任何相关信息。


2
请展示包含语句上下几行代码!也许它在函数声明之前,我不确定(这段代码的作用是:它会引用一个文件!因为你知道,你可以这么做……) - Rizier123
2
预处理器允许在源文件中的任何位置使用指令(只要它们位于自己的行上,且#位于第一列),而不必在特定位置。因此,#include 指令所做的就像您所习惯的一样,它将另一个文件的内容包含到当前文件中。 - Some programmer dude
它与文件顶部的 #include 做的事情相同,只是在不同的位置执行。本质上,它打开了被包含的文件,并将该文件的内容复制到 #include 语句所占据的空间中。 - Brad S.
我认为它可以放在函数声明之上,然后你需要这个库或类似的东西。 - Rizier123
代码遵循哪个标准,ANSI 还是 Turbo 标准? - Maximin
3个回答

5

#include 是一个预处理器指令,它会将给定的文件内容导入到当前文件中。通常情况下,我们会使用它来引用头文件中公共函数的定义,但其实并非必须如此。


3

它的使用并不限于文件开头,但请注意,即使在同一文件上,声明在此标头中的变量、宏或函数在包括语句之前也无法使用。


1
作为大家告诉你的,#include可以在任何地方使用(只要它在自己的逻辑行上)。有时您想要多次#include相同的文件。首先阅读X macroC preprocessor维基页面。
我在我的MELT monitor中有一个具体的例子(与MELT相关...)。
我有一个predef-monimelt.h(生成的)文件,其中包含类似以下行的内容:
MOM_PREDEFINED_NAMED( name, id,hash) 例如。
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+许可的软件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接