1. 程式人生 > >關於C語言中extern宣告外部…

關於C語言中extern宣告外部…

    最近在做畢業設計,我是學電子資訊工程專業,大學四年就學了C語言和一點點組合語言,本人喜歡做硬體電路方面的東東,所以畢業設計選做硬體方向的課題,但是,現在電子科技的發展,已經軟體、硬體分不開了,做硬體的同時也離不開通過軟體程式設計來對硬體平臺的開發。畢業設計期間,在程式設計上遇到點問題,很是困惑,問題雖然已經解決,但是,對問題本質仍沒有很好的理解,固寫於部落格中,希望有識之士能在此給予指教。

    在說問題之前,先簡單說一下有關extern的知識。來自譚浩強老師的C程式設計一書。

    外部變數是在函式的外部定義的全域性變數,它的作用域是從變數的鎳開始,到本程式檔案的末尾。在此作用域內,全域性變數可以為程式中各個函式所引用。編譯時將外部變數分配在靜態儲存區。有時需要用extern來宣告外部變數,以擴充套件外部變數的作用域。

1、  在一個檔案內宣告外部變數

    如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案結束。如果想在定義之前使用,剛應該在引用之前用關鍵字extern對該變數作“外部變數宣告”。

2、  在多檔案的程式中宣告外部變數

    一個C程式可以由一個或多個源程式檔案組成,如果程式只由一個原始檔組成,使用外部變數的方法前面已經介紹。如果程式由多個原始檔組成,那麼在一個檔案中想引用另一個檔案中已定義的外部變數,應該怎麼辦?

    在任一個檔案中定義的外部變數,而在另一個檔案中用extern對其作“外部變數申明”,就將另一檔案中的外部變數作用域擴充套件到本檔案中了。

我遇到的問題是:我舉例說明

Main()主函式:

#include <stdio.h>
#include "lil9320.h" typedef unsigned char uchar;
typedef unsigned int  uint; char a=0,b=0; void change2(uchar a,uchar b)
{
 printf("%dn",a);
 printf("%dn",b);
}
void change3()
{
 printf("%dn",a);
 printf("%dn",b);
} void main()
{  a=3;b=55;
 printf("%dn",&a);
 printf("%dn",&b);
 printf("***************************************n");
 change(a,b);
 change1();
 change2(a,b);
 change3(); }

Lil9320.c檔案:

#include "lil9320.h"
extern   a,b;
void change(uchar a,uchar b)
{
 printf("%dn",a);
 printf("%dn",b);
} void change1()
{
 printf("%dn",a);
 printf("%dn",b);
}

執行結果:

疑惑:既然在lil9320.c檔案中對a,b通過extern a,b;進行了外部變數的作用域的擴充套件,那麼為什麼在lil9320.c檔案中的子函式中使用a,b變數時,在函式中不定義形參為什麼不可以??而定義了形參後就可以了??

最後,通過向別人學習,仔細看書才發現,書上面的例子是這樣的,

File1.c中定義外部變數如下:int a;

File2.c中擴充套件外部變數作用域如下:extern a;

通過對比發現,我程式只有變數型別不一樣,最後,我在我的lil9320.c檔案中的extern a,b改為了extern uchar a,b;就對了。

原來問題就在這,書上面能這樣寫extern a;省略變數型別是因為人家用的是int 型別啊,預設型別。只有int 型別才可以省略啊!

    所以,看書一定要看仔細,看認真,程式設計一定要嚴格,本人程式設計經歷太少了,不過對此問題以後不會再犯錯了。發現了問題終於再一次證明了自己的程式設計能力是如此的不給力啊!以後努力學習,反省錯誤!

規格嚴格,功夫到家!