2009-06-25 135 views
51

關於C聲明的初學者問題:如何在不同的.c文件之間共享變量?

在.c文件中,如何使用另一個.c文件中定義的變量?

+10

我改變了你的頭銜。試着讓標題更具描述性,以便1)能夠回答問題的人可以很容易地看到你問的問題,以及2)讓其他具有相同問題的人能夠找到這個問題,我不得不再次提問。 查看問題列表時,我們不需要知道這是一個初學者問題,但我們*需要知道問題是關於什麼的。只是提示未來的問題。 :) – jalf 2009-06-25 18:51:13

回答

97

在fileA.c:

int myGlobal = 0; 

在fileA.h

extern int myGlobal; 

在fileB.c:

#include "fileA.h" 
myGlobal = 1; 

因此,這是它如何工作的:

  • 在fileA.c變量生活
  • fileA.h告訴全世界它的存在,什麼其類型是(int
  • fileB.c包含fileA.h,以便在fileB.c嘗試使用它之前,編譯器知道myGlobal。
+0

當變量是靜態的,它給我一個鏈接錯誤,「無法解析的符號」,如何處理? – Kim 2009-06-25 18:39:10

+10

@jfq:非類上下文中的「static」表示「僅限於此翻譯單元」。它基本上與「extern」相反。你不能同時擁有兩者。 – rmeador 2009-06-25 18:40:25

+0

只是一句話 - 如果變量的所有者是main.c文件,並且沒有main.h,該怎麼辦? – jdepypere 2013-05-10 18:50:26

10

如果變量是:

int foo; 
在第二個C文件

聲明:

extern int foo; 
3

那些其他變量將不得不聲明爲public(使用extern,public是C++),您將不得不包含該.c文件。但是,我建議創建適當的.h文件來定義所有變量。

例如,對於hello.c,您將有一個hello.h,並且hello.h將存儲您的變量定義。然後另一個.c文件,如world.c會對這段代碼的頂部:

#include "hello.h" 

這將使world.c使用在hello.h中定義的變量

這是略比這更復雜。您可以使用<>來包含在您的操作系統路徑中找到的庫文件。作爲初學者,我會把所有的文件放在同一個文件夾中,並使用「」語法。

2

第二個文件需要知道變量的存在。要做到這一點,你再次聲明變量,但使用前面的關鍵字extern。這告訴編譯器該變量是可用的,但在其他地方聲明,從而防止實例化(再次,這將在鏈接時引起衝突)。雖然你可以extern聲明放在C文件本身中,但是對於每個.c文件都有一個伴隨頭文件(即.h)文件,這種文件向其他人提供函數或變量來保存extern聲明。這樣可以避免複製extern聲明,特別是在多個其他文件中使用時。這同樣適用於功能,但您不需要關鍵字extern

這樣你至少可以得到三個文件:聲明變量的源文件,它是執行extern聲明的acompanying頭文件,以及獲得訪問導出變量的頭文件的第二個源文件(或任何其他符號導出在標題中)。當然,當試圖鏈接類似的東西時,你需要所有的源文件(或適當的目標文件),因爲鏈接器需要解析符號,只有鏈接文件中實際存在該符號時纔有可能。

12
  1. 儘量避免使用全局變量。如果您必須使用全局,請參閱其他答案。
  2. 將它作爲參數傳遞給函數。
5

在99.9%的所有情況下,在文件之間共享非常量的全局變量是很糟糕的程序設計。當你真的需要這樣做的時候,很少有這種情況:他們非常罕見,我不能提出任何有效的案例。也許是硬件寄存器的聲明。而在大多數情況下,您應該使用(可能內聯)setter/getter函數(「public」),文件範圍(「private」)的靜態變量或不完整類型實現(「private」)。

在那些少數極少數情況下,當你需要共享文件之間的變量,這樣做:

// file.h 
extern int my_var; 

// file.c 
#include "file.h" 
int my_var = something; 

// main.c 
#include "file.h" 
use(my_var); 

不要把任何形式的變量定義在h文件。