C語言聲明與定義總結

1.變量的聲明和定義
聲明一個變量意味着向編譯器描述變量的類型,但並不爲變量分配存儲空間。
定義一個變量意味着在聲明變量的同時還要爲變量分配存儲空間。

2.通常,局部變量只定義不聲明,而全局變量多在源文件中定義,在頭文件中聲明。

3.靜態局部變量static
靜態局部變量是指在函數體內聲明和定義的局部變量,它僅供本函數使用,即其他函數不能調用它。靜態局部變量的值在函數調用結束後不消
失而保留原值,即其佔用的存儲單元不釋放,在下一次函數調用時,該變量已有值,就是上一次函數調用結束時的值。
靜態局部變量在靜態存儲區分配存儲單元,在程序的整個運行期間都不釋放。靜態局部變量是在編譯時賦初值的,即只賦初值一次。

4.寄存器變量register
帶register修飾符的變量暗示(僅僅是暗示而不是命令)編譯程序本變量將被頻繁使用,如果可能的話,應將其保留在CPU的寄存器中,以加
快其存取速度。對於現有的大多數編譯程序,最好不要使用register修飾符。

5.全局變量
在函數之外定義的變量稱爲外部變量,外部變量是全局變量,它可以爲本文件中其他函數所共用。全局變量都是靜態存儲方式,都是在編譯時
分配內存,但是作用範圍有所不同。
靜態外部變量static
靜態外部變量只能在本文件中使用。所以靜態外部變量應該在當前源文件中聲明和定義。
兩者區別:
全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變量
的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用
域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲
該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。

6.外部變量extern
定義函數中的全局變量時,其缺省格式是外部變量類型。外部變量應該在一個頭文件中聲明,在當前源文件中定義。外部變量允許其他文件引
用。

7.static全局變量與普通的全局變量有什麼區別:
static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什麼區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
程序的局部變量存在於(堆棧)中,全局變量存在於(靜態區)中,動態申請數據存在於( 堆)中。

8.內部函數的聲明和定義多在當前源文件中完成;而外部函數通常在源文件中定義,在頭文件中聲明。
一個良好的編程習慣是在頭文件中聲明函數的原型。這可方便編譯程序查錯。定義函數時,缺省的函數類型是外部函數。如:void fun2
(void); 和extern void fun2(void); 其函數類型是等價的,但前一個是定義函數,後一個是聲明函數。

9.C語言中的函數不用聲明的情況有三種:
(1).返回值爲int和char類型的函數不必聲明;
(2)。被調函數定義在主調函數之前,被調函數不必聲明;
(3).函數的外部已聲明過了,主調函數中不必聲明
另外:如果不指定函數的返回值,那麼系統會默認函數的返回值類型爲int, 而當一個返回值爲int的函數作爲被調函數時,無論它定義在什麼
位置,都可以被其所在源文件中的其他函數調用。
 

10 . #ifdef 的用法
頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同
編譯成一個可運行文件,於是問題來了,大量的聲明衝突。
還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:
#ifndef <標識>
#define <標識>
......
......
#endif
<標識>在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃
線,並把文件名中的“.”也變成下劃線,如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

(2) 靈活使用#ifdef指示符,我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。
代碼舉例:新建define.cpp文件
#include "iostream.h"
int main()
{
#ifdef DEBUG     
cout<< "Beginning execution of main()";
#endif     
return 0;
}
運行結果爲:Press any key to continue
改寫代碼如下:
#include "iostream.h"
#define DEBUG
int main()
{
#ifdef DEBUG     
cout<< "Beginning execution of main()";
#endif      
return 0;
}
運行結果爲:Beginning execution of main()
                      Press any key to continue
更一般的情況是,#define語句是包含在一個特定的頭文件中。
比如,新建頭文件head.h,在文件中加入代碼:
#ifndef DEBUG
#define DEBUG
#endif
而在define.cpp源文件中,代碼修改如下:
#include "iostream.h"
#include "head.h"
int main(){
#ifdef DEBUG     
cout<< "Beginning execution of main()";
#endif      
return 0;
}
運行結果如下:Beginning execution of main()
                         Press any key to continue
結論:通過使用#ifdef指示符,我們可以區隔一些與特定頭文件、程序庫和其他文件版本有關的代碼。

(3)  如果你的程序由幾個文件組成,而且有兩個以上的文件都要包含同一個文件,爲了避免重複包含同一個文件,所以在要被包含多次的文
件中用#ifdef。
#ifdef    就是說if    define,(如果定義了)  
   就像if    else語句一樣
/*試舉一個例子:  
   如果想編寫一個既可用    TC    編譯又可用    VC    編譯的程序,但不同的編譯器生成的可執行文件的功能不同時,    #ifdef    就
有用了.  
   
   下面這個程序,如果用    VC    編譯,只會顯示一句話;    但若用    TC    編譯,既顯示一句話,又把背景顏色改爲藍色。  
   這樣做的原因是    VC    沒有    textbackground()    這個函數,    爲了不改變源程序而適應不同的編譯器,    這種條件編譯
(conditional    compilation)的方法比較有用.  
   另外,有些    Windows    API    對操作系統的版本有要求,這時條件編譯又可派上用場了.  
   */  
   
   #i nclude    <stdio.h>  
   #i nclude    <conio.h>  
   
   #ifdef    WIN32 /*使用    Visual    C++    6.0    作爲編譯器時,    "WIN32"    自動被VC定義,*/  
   #define    VC /*從而定義了"VC"*/  
   #endif  
   
   int    main(void)  
   {  
   #ifdef    VC /*如果    VC    被定義,    執行下面的代碼*/  
   printf("This    program    was    compiled    by    VC    6.0\n");  
   
   #else /*否則(即    VC    未被定義),    執行下面的代碼*/  
   /*使用    Turbo    C    作爲編譯器時執行*/  
   textbackground(BLUE); /*背景顏色改爲藍色*/  
   clrscr();  
   printf("This    program    was    not    compiled    by    VC    6.0\n");  
   #endif /*#ifdef    VC*/  
   
   /*不論用何編譯器,    以下代碼都會被編譯*/  
   printf("Hello,    world");  
   getch();  
   return    0; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章