2016-01-06 33 views
0

我最近看到有這樣定義一個頭文件:使用#ifndef和#define是否更改內存分配?

#ifndef DEFINE_ME 
#define DEFINE_ME  1 
    char abc[10]; 
#endif 

而且我還發現,DEFINE_ME從未在該項目的任何其他頭文件中定義爲什麼被使用的#ifndef?它是否必須對內存做任何事情?

回答

1

它包括警衛。

這樣做的目的是防止變量的多重聲明。

ifndef =如果未定義。 然後定義它.. 如果定義則使用先前的聲明..

假設u有兩個頭文件

頭1:

#ifndef DEFINE_ME 
#define DEFINE_ME  1 
#endif 

頭2:

#ifndef DEFINE_ME 
#define DEFINE_ME  1 

#endif 

現在如果在c文件中首標2包含,則它將包含來自首標2而不是來自首標1的值,因爲它已經在首標2中定義

你可以有頭文件中後衛也可以作爲解釋如下:

那麼header1.h

#ifndef _header1 
#define _header1 
#ifndef VAR1 
#ifdef VAR1 5 
#endif 
#endif 

頭2。^ h

#ifndef _header2 
#define _header2 
#ifndef VAR1 
#ifdef VAR1 5 
#endif 
#endif 

現在你已經用保護好讓你誤包括在同一個項目中的不同文件相同的標題,然後又U將是安全的。

+0

這很好解釋我的問題,看看有沒有這樣的header1文件確定。 別忘了char abc [10]; ? 這是以後使用的文件中唯一存在的內容。 –

+0

確定沒有header1 ...但它的安全目的是爲了避免單個變量的多個值 – Grv

+0

並且它會影響內存分配嗎? –

2

這就是所謂的include guard.

DEFINE_ME的目的是防止特別被包括(在那裏的定義)的頭文件意外地多次。


要了解它是如何工作,嘗試沒有包括後衛:

header.h:

int x = 5; 

file.c:

#include "header.h" 
#include "header.h" 

int main() { 
    printf("%d\n", x); 
} 

,然後嘗試與包括後衛:

header.h:

#ifndef DEFINE_ME 
#define DEFINE_ME 1 

int x = 5; 

#endif 

file.c:

#include "header.h" 
#include "header.h" 

int main() { 
    printf("%d\n", x); 
} 

當你有DEFINE_ME,標題將被列入fil.c的首次header.h是作爲DEFINE_ME之前沒有定義。但是下一個#include "header.h"將不包括警衛的內容,因爲DEFINE_ME已經被前面的包含定義。

+0

我知道,但它沒有被定義,除了在這個頭文件中。沒有多重的情況。 –

+3

因爲目的是防止多次包含_this_頭文件。 – Arc676

+0

多個包含頭文件或變量DEFINE_ME的多個聲明??? –