2014-12-06 43 views
4

請問, 你能告訴我下面的代碼是做什麼的?C中的代碼中包含了什麼?

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

我曾經習慣把包括每個文件的開始。我從來沒有見過這個,也無法在互聯網上找到任何東西。

+2

請出示上方,下有幾行!也許它是在我不知道的函數聲明之前(並且代碼的作用是:它包含一個文件!因爲你知道,你可以......) – Rizier123 2014-12-06 18:51:45

+2

預處理器允許源文件中的指令*任意位置*(只要他們是在他們自己的路線上,在第一欄用'#'),它不一定要在特定的地方。所以'#include'指令只是做你習慣的,它包含了另一個文件的內容到當前文件中。 – 2014-12-06 18:53:08

+0

它與文件頂部的#include執行相同的操作。它只是在不同的地方。本質上,它打開包含文件並將該文件的內容複製到#include語句佔用的空間中。 – 2014-12-06 18:53:39

回答

3

#include是一個預處理器指令,將指定的文件作爲參數並轉儲其當前文件中的內容。通常,這用於包含來自頭文件的公共函數的定義,但沒有必要以這種方式使用它。

3

它的用法不限於文件的開始,但是請注意,即使在同一個文件中,包含語句之前聲明的變量,宏或函數也不可用。

1

大家都告訴你,#include可以用在任何地方(只要它在自己的邏輯線上)。並且有幾種情況你想#include幾次相同文件。請先閱讀X macro wikipage和C preprocessor wikipage。

我在我的MELT monitor(與MELT ...有關)中有一個具體的例子。

我有一個包含像
MOM_PREDEFINED_NAMED(名稱,ID,散列)例如線predef-monimelt.h(生成)文件

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,熔體顯示器的GPLv3 +正版軟件