如果我有一個可能在多個源中使用的變量,在頭文件中聲明它是一個好習慣嗎?或者在.c
文件中聲明並在其他文件中使用extern
更好?頭文件中的變量聲明
回答
你應該聲明變量在頭文件:
extern int x;
和然後在一個 C文件定義它:
int x;
在C語言中,定義和聲明之間的區別是定義爲變量保留空間,而聲明只是將變量引入符號表(並且會導致鏈接器在它到達時尋找它鏈接時間)。
您可以(應該)在頭文件中聲明它爲extern
,並將其定義在正好1.c文件中。
需要注意的是.c文件也應該使用的頭和標準模式如下:
// file.h
extern int x; // declaration
// file.c
#include "file.h"
int x = 1; // definition and re-declaration
事實上,它*應該*總是使用頭部,以便如果類型在聲明和定義之間發生衝突,編譯器會告訴你。 – caf 2009-07-22 14:21:51
貓,你說得對,我會重新講一點。 – 2009-07-22 14:26:57
如果聲明它像
int x;
在頭文件
,然後將其包含在多個地方,你將與x的多個實例結束(和潛在編譯或鏈路問題)。
解決這個正確的方法是有頭文件說
extern int x; /* declared in foo.c */
,然後在文件foo.c你可以說
int x; /* exported in foo.h */
,那麼你可以包括你的頭文件中儘可能多的你喜歡的地方。
關鍵是要保持頭文件和源文件中變量的聲明相同。
我用這一招
------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的類型時,它會改變爲每個人。您不需要記住在源文件和頭文件中更改它。
你如何處理初始化? - extern int x = 6;會對大多數編譯器發出警告。 – Dipstick 2009-07-22 22:07:15
這個解決方案呢?
#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 */
唯一拉回我看到的是,包括後衛不救你,如果你在同一個文件包括兩次。
- 1. 在頭文件中聲明變量
- 2. 在頭文件中聲明變量C++
- 3. 頭文件中的聲明
- 4. 開關頭中的變量聲明?
- 5. 聲明變量文件
- 6. 爲什麼沒有在頭文件中聲明該變量?
- 7. 在全局頭文件中聲明一個全局變量?
- 8. 在頭文件中聲明的C++私有成員與在cpp文件中聲明的靜態變量
- 9. 如何在源文件中使用頭文件中聲明的全局變量?
- 10. 在JavaFX CSS文件中聲明變量
- 11. C - 聲明中的未聲明變量
- 12. 聲明變量的條件
- 13. 在文件中訪問聲明爲變量的變量
- 14. 頭文件中的枚舉聲明
- 15. 頭文件中重複的類聲明
- 16. gtkmm頭文件中的衝突聲明
- 17. 頭文件中的空類聲明?
- 18. 如何在兩個.cpp中聲明頭文件中使用的變量?
- 19. 在不同的HTML文件中聲明在JAVASCRIPT中聲明的變量
- 20. 變量聲明
- 21. 聲明變量
- 22. 變量聲明
- 23. 聲明變量
- 24. 變量聲明
- 25. 變量聲明?
- 26. 聲明變量
- 27. 聲明變量
- 28. 爲什麼在頭文件中聲明類聲明中的變量時出現錯誤?
- 29. Struts2中的變量聲明
- 30. 如何釋放我的頭文件中聲明的靜態變量?
**兩個**都是聲明!在文件範圍內,第二個不是(完整)定義,而是一個可以定義的定義。 – Olaf 2016-10-05 12:49:36