回答
在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。
如果變量是:
int foo;
在第二個C文件
聲明:
extern int foo;
那些其他變量將不得不聲明爲public(使用extern,public是C++),您將不得不包含該.c文件。但是,我建議創建適當的.h文件來定義所有變量。
例如,對於hello.c,您將有一個hello.h,並且hello.h將存儲您的變量定義。然後另一個.c文件,如world.c會對這段代碼的頂部:
#include "hello.h"
這將使world.c使用在hello.h中定義的變量
這是略比這更復雜。您可以使用<>來包含在您的操作系統路徑中找到的庫文件。作爲初學者,我會把所有的文件放在同一個文件夾中,並使用「」語法。
第二個文件需要知道變量的存在。要做到這一點,你再次聲明變量,但使用前面的關鍵字extern
。這告訴編譯器該變量是可用的,但在其他地方聲明,從而防止實例化(再次,這將在鏈接時引起衝突)。雖然你可以將extern
聲明放在C文件本身中,但是對於每個.c
文件都有一個伴隨頭文件(即.h
)文件,這種文件向其他人提供函數或變量來保存extern
聲明。這樣可以避免複製extern
聲明,特別是在多個其他文件中使用時。這同樣適用於功能,但您不需要關鍵字extern
。
這樣你至少可以得到三個文件:聲明變量的源文件,它是執行extern
聲明的acompanying頭文件,以及獲得訪問導出變量的頭文件的第二個源文件(或任何其他符號導出在標題中)。當然,當試圖鏈接類似的東西時,你需要所有的源文件(或適當的目標文件),因爲鏈接器需要解析符號,只有鏈接文件中實際存在該符號時纔有可能。
- 儘量避免使用全局變量。如果您必須使用全局,請參閱其他答案。
- 將它作爲參數傳遞給函數。
在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文件。
- 1. 如何在不同的導入文件之間共享變量?
- 2. c文件之間共享變量
- 3. 變量在不同項目之間共享的頭文件
- 4. 如何在C++源文件之間共享靜態變量?
- 5. 在PHP文件之間共享變量
- 6. 在C#和C++之間共享變量
- 7. 在C#和C之間共享變量
- 8. 如何在共享上下文之間共享RSpec讓變量?
- 9. 在不同類的對象之間共享變量(C++)
- 10. 如何在Matlab中的不同m文件之間共享變量
- 11. 在PowerShell和C#之間共享變量
- 12. C++在對象之間共享變量。
- 13. 在類C++之間共享變量?
- 14. 在.c文件之間共享全局變量
- 15. 如何在模塊之間共享相同的變量?
- 16. 如何在android JNI中共享Java和C之間的變量?
- 17. 在兩個不同的軟件模塊之間共享變量c
- 18. 如何共享PHP變量在2個不同的PHP文件
- 19. 如何在獨立功能之間共享相同變量
- 20. 在不同的宏之間共享變量
- 21. Apache2 :: RequestUtil ::在不同的請求之間共享變量嗎?
- 22. 在drupal中的不同.tpl.php模板之間共享變量
- 23. 如何在C#和JavaScript之間共享變量?
- 24. 如何在多個交互C文件之間使用共享變量?
- 25. React組件之間共享變量
- 26. 不能共享pthread之間的變量,值是不同的
- 27. 類間共享變量C++
- 28. 如何在objective-c中的不同類之間共享屬性?
- 29. 如何訪問不同訪問器之間共享的文件?
- 30. C#在不同的exe之間共享不同的DLL
我改變了你的頭銜。試着讓標題更具描述性,以便1)能夠回答問題的人可以很容易地看到你問的問題,以及2)讓其他具有相同問題的人能夠找到這個問題,我不得不再次提問。 查看問題列表時,我們不需要知道這是一個初學者問題,但我們*需要知道問題是關於什麼的。只是提示未來的問題。 :) – jalf 2009-06-25 18:51:13