externc語言
㈠ 關於extern (c語言)
第一個問題不屬於重復定義,因為File_1.c中定義的變數a和b的作用域僅從定義處至本文件末尾,而tt.c文件中定義的a和b同樣如此,二者的作用域沒有交叉,顯然不是重復定義。
第二個問題:extern int a;的含義是本文件使用的變數a是外部文件定義的,C語言會在本工程內的所有文件中尋找該定義,所有沒有問題!
㈡ c語言extern
extern是全局變數聲明
只要聲明全局變數就默認 前面加extern(程序員可以不加,但編譯器默認加上)
若本文件 引用別的文件中的全局變數 一定要加上extern 聲明一下
例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中聲明了的一個全局變數
這個extern 是個聲明他可以在任何地方聲明 引用了一個全局變數 (可以試試 在main()函數執行完之後聲明 也不會出錯)
這樣在 工程的總頭文件中就不需要考慮 先#include 哪個文件了
㈢ C語言編程,extern A,B是什麼意思
表示變數A和B在外部定義,這是告訴編譯器,這個時候不要報錯。同時告訴連接器,這兩個變數在其他的地方定義了,讓它去其他地方尋找。
㈣ extern在c語言中是什麼意思
是一個修飾符。
在C語言中,修飾符extern用在變數或者函數的聲明前,用來說明「此變數/函數是在別處定義的,要在此處引用」。
extern可置於變數或者函數前,以表示變數或者函數的定義在別的文件中,提示編譯器遇到此變數或函數時,在其它模塊中尋找其定義。另外,extern也可用來進行鏈接指定。
㈤ c語言中的extern是什麼,有什麼作用啊
extern關鍵字可以置於變數或者函數前,以標示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。這里起到的是聲明作用范圍的用處。
extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數或變數,那麼要加extern來告訴編譯器用c方式命名函數:
文檔A.cpp調用a.c裡面的變數i和函數callme()
添加了extern 「C」鏈接指示後,上面的代碼就能夠正常運行了。
㈥ C語言中extern的用法
extern可以置於變數或者函數前,以表示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。
另外,extern也可用來進行鏈接指定。
extern 變數
在一個源文件里定義了一個數組:char a[6]; 在另外一個文件里用下列語句進行了聲明:extern char *a; 請問,這樣可以嗎? 答案與分析: 1)、不可以,程序運行時會告訴你非法訪問。原因在於,指向類型T的指針並不等價於類型T的數組。extern char *a聲明的是一個指針變數而不是字元數組,因此與實際的定義不同,從而造成運行時非法訪問。應該將聲明改為extern char a[ ]。 2)、例子分析如下,如果a[] = "abcd",則外部變數a=0x12345678 (數組的起始地址),而*a是重新定義了一個指針變數a的地址可能是0x87654321,直接使用*a是錯誤的. 3)、這提示我們,在使用extern時候要嚴格對應聲明時的格式,在實際編程中,這樣的錯誤屢見不鮮。 4)、extern用在變數聲明中常常有這樣一個作用,你在*.c文件中聲明了一個全局的變數,這個全局的變數如果要被引用,就放在*.h中並用extern來聲明。
函數
extern 函數1 常常見extern放在函數的前面成為函數聲明的一部分,那麼,C語言的關鍵字extern在函數的聲明中起什麼作用? 答案與分析: 如果函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件里定義,沒有其它作用。即下述兩個函數聲明沒有明顯的區別: extern int f(); 和int f(); 當然,這樣的用處還是有的,就是在程序中取代include 「*.h」來聲明函數,在一些復雜的項目中,我比較習慣在所有的函數聲明前添加extern修飾。 extern 函數2 當函數提供方單方面修改函數原型時,如果使用方不知情繼續沿用原來的extern申明,這樣編譯時編譯器不會報錯。但是在運行過程中,因為少了或者多了輸入參數,往往會照成系統錯誤,這種情況應該如何解決? 答案與分析: 目前業界針對這種情況的處理沒有一個很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供對外部介面的聲明,然後調用方include該頭文件,從而省去extern這一步。以避免這種錯誤。 寶劍有雙鋒,對extern的應用,不同的場合應該選擇不同的做法。 extern 「C」 在C++環境下使用C函數的時候,常常會出現編譯器無法找到obj模塊中的C函數定義,從而導致鏈接失敗的情況,應該如何解決這種情況呢? 答案與分析: C++語言在編譯的時候為了解決函數的多態問題,會將函數名和參數聯合起來生成一個中間的函數名稱,而C語言則不會,因此會造成鏈接時找不到對應函數的情況,此時C函數就需要用extern 「C」進行鏈接指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈接的中間函數名。 下面是一個標準的寫法: //在.h文件的頭上 #ifdef __cplusplus #if __cplusplus extern "C"{ #endif #endif /* __cplusplus */ … … //.h文件結束的地方 #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */
㈦ c語言extern的用法
你這里有幾個問題我給你說下。
1,我把你的程序直接黏貼是編譯不了的,就是有許多中文字元的符號,這個要注意,所有符號要在英文格式下輸入。
2,你在main函數中並沒有調用num()這個函數,也就是num()函數未被執行,所以即使編譯通過也不會輸出3,而可能是0或者不確定的值。
3,再就是如果num函數在另外一個.c文件中,你在main函數的c文件中要對num函數進行聲明,extern int num()這個要放在main函數的外部,並且在main函數的上邊。並且對於 a 這個全局變數也要聲明,也就是extern int a;這句。 你放在main函數中是沒問題的,但是這個就意味著a這個變數只能在 main 函數中被調用,而無法在main所在的c文件中的其他函數調用。
㈧ extern在c語言中是什麼意思
extern關鍵字可以置於變數或者函數前,以標示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。這里起到的是聲明作用范圍的用處。
extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數或變數,那麼要加extern來告訴編譯器用c方式命名函數:
文檔A.cpp調用a.c裡面的變數i和函數callme()
(8)externc語言擴展閱讀
C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。
實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。
㈨ 在C語言中頭文件的extern是什麼意思呢
1.頭文件中不可以放變數的定義!一般頭文件中只是放變數的聲明,因為頭文件要被其他文件包含#include,如果把定義放在頭文件的話,就不能避免多次定義變數。C++不允許多次定義變數,一個程序中對指定變數的定義只有一次,聲明可以無數次。
三個例外:1)值在編譯時就已知的const變數的定義可放在頭文件中,如:const int num=10;
2)類的定義可放在頭文件中。
3)inline函數。
2.定義和聲明是不同的。定義只能出現一次,而聲明可以出現多次。
下面的語句是定義,不能放在頭文件中:
extern int ival=10; //雖然ival聲明為extern,但是它初始化了,代表這是個定義。
double fica_rate; //fica_rate雖然沒有初始化,但是沒有extern。所以仍是定義。
3.在多個C文件的程序中,想在頭文件中聲明定義幾個變數,如果給聲明的變數賦值,則提示重復定義,在聲明的變數前加extern只對變數進行聲明,可是在什麼地方給變數賦值呢??
答:加了extern後,就可以在其他任何引用此文件的地方來進行賦值的。比如說,可在主文件中進行賦值。
4. extern int x; //變數是聲明,並未實際分配地址。
void print(); //函數聲明,並未產生實際目標代碼
如:int x; int x=3; void print() { }; //均為定義。
5。只有全局變數並且沒有被static聲明的變數才能聲明為extern。所以,如果你不想自己源文件中全局變數被其他文件引用,你就可以給變數加上static聲明。
定義也是聲明。C++中有個關鍵字用來聲明變數的,即extern。它聲明一個變數,而不定義它。
注意:在C++中,變數有且只能有一次定義,但是可以聲明多次。