2009-07-22 77 views
48

如果我有一個可能在多個源中使用的變量,在頭文件中聲明它是一個好習慣嗎?或者在.c文件中聲明並在其他文件中使用extern更好?頭文件中的變量聲明

回答

89

你應該聲明變量在頭文件:

extern int x; 

和然後一個 C文件定義它:

int x; 

在C語言中,定義和聲明之間的區別是定義爲變量保留空間,而聲明只是將變量引入符號表(並且會導致鏈接器在它到達時尋找它鏈接時間)。

+3

**兩個**都是聲明!在文件範圍內,第二個不是(完整)定義,而是一個可以定義的定義。 – Olaf 2016-10-05 12:49:36

29

您可以(應該)在頭文件中聲明它爲extern,並將其定義在正好1.c文件中。

需要注意的是.c文件也應該使用的頭和標準模式如下:

// file.h 
extern int x; // declaration 

// file.c 
#include "file.h" 
int x = 1; // definition and re-declaration 
+0

事實上,它*應該*總是使用頭部,以便如果類型在聲明和定義之間發生衝突,編譯器會告訴你。 – caf 2009-07-22 14:21:51

+0

貓,你說得對,我會重新講一點。 – 2009-07-22 14:26:57

9

如果聲明它像

int x; 
在頭文件

,然後將其包含在多個地方,你將與x的多個實例結束(和潛在編譯或鏈路問題)。

解決這個正確的方法是有頭文件說

extern int x; /* declared in foo.c */ 

,然後在文件foo.c你可以說

int x; /* exported in foo.h */ 

,那麼你可以包括你的頭文件中儘可能多的你喜歡的地方。

3

關鍵是要保持頭文件和源文件中變量的聲明相同。

我用這一招

------sample.c------ 
#define sample_c 
#include sample.h 

(rest of sample .c) 

------sample.h------ 
#ifdef sample_c 
#define EXTERN 
#else 
#define EXTERN extern 
#endif 

EXTERN int x; 

sample.c文件只編譯一次,它定義的變量。任何包含sample.h的文件只會被賦予變量的「extern」;它確實爲該變量分配空間。

當你改變x的類型時,它會改變爲每個人。您不需要記住在源文件和頭文件中更改它。

+2

你如何處理初始化? - extern int x = 6;會對大多數編譯器發出警告。 – Dipstick 2009-07-22 22:07:15

0

這個解決方案呢?

#ifndef VERSION_H 
#define VERSION_H 

static const char SVER[] = "14.2.1"; 
static const char AVER[] = "1.1.0.0"; 

#else 

extern static const char SVER[]; 
extern static const char AVER[]; 

#endif /*VERSION_H */ 

唯一拉回我看到的是,包括後衛不救你,如果你在同一個文件包括兩次。