符號常量是乙個常量,是不變數,所以,在編譯的時候,就把符號常量出現的地方,替換為符號常量對應的常量。符號常量一般使用者定義乙個全域性使用的資料,而且要改變該資料的時候,只需要改變符號常量的值,**中引用符號常量的地方,都會把值相應修改過來。如下是乙個測試的例子。
#include
//包含標頭檔案
, 為了使用
printf()函式;
#define
a100
//定義符號常量
a, 代表
100數值;
#define
name
'c'//
定義符號常量
name,
代表字元
'c'
intmain()
//定義程式的主函式
, 就是程式的入口位址;
//主函式的結束標記;
程式的執行結果如下:
mylinux@ubuntu:~/src/test$ gcc test.c -o exe
mylinux@ubuntu:~/src/test$ ./exe
a = 100
x = 100, y = 200, z = 300
可以看到,x, y, z 變數的值,相差100,這個100就是符號常量a的值。那麼,如果我們想設定x, y, z 變數的值相差500,我們只需要修改符號常量a的定義為:
#define a 500
那麼,在編譯**的時候,就把符號常量a出現的地方,使用500這個數值來代替,所以,就有:
x = 500;
y = x + 500;
z = y + 500;
所以,符號常量的乙個優點是:修改符號常量的值,在**中所有引用符號常量的地方,都相應引用修改後的符號常量值。
下面講解乙個知識點,初學者可以跳過。當學習了if選擇語句和預編譯之後,才可以理解該知識點的講解。
符號常量還有乙個很大的優點,就是「選擇性編譯**」,因為符號常量是在編譯的時候,把符號常量替換為它代表的值。所以,配合#if巨集編譯,可以選擇編譯某些**。例如,我們開發乙個程式,要求相容linux和windows作業系統平台的執行,那麼,就需要在編譯**的時候,選擇編譯linux系統下的**還是windows系統下的**。如下是乙個測試的例子。
#include
//包含標頭檔案
, 為了使用
printf()函式;
#define
sys_linux
1
//定義符號常量
sys_linux
代表數值1;
intmain()
//定義程式的主函式
, 就是程式的入口位址;
//主函式的結束標記;
程式執行結果如下:
mylinux@ubuntu:~/src/test$ gcc test.c -o exe
mylinux@ubuntu:~/src/test$ ./exe
linux system!
可以看到,我們定義了符號常量sys_linux,它代表的常量值是1。所以,在 #if 預編譯條件中,就是 #if 1 成立,所以,執行linux系統下的**:
printf("linux system!\n");
那麼,當我們想編譯該系統在windows操心系統下執行的時候,就是需要編譯windows系統下的**,所以,可以修改符號常量的定義為:
#define sys_linux 0
此時,#if 0 成立,執行 #else 後面的**。所以,通過配置sys_linux 符號常量的值為零和非零,我們可以定義編譯器選擇編譯linux系統下的**還是windows系統下的**。
針對這個問題,我們可以更深入地思考:如果我們要編譯該程式在linux系統下執行,也要編譯它在windows系統下執行,就是需要編譯兩個版本。那麼,每次編譯的時候,都要去修改sys_linux符號常量的值,這樣確實很不方便!
那麼,gcc在編譯**的時候,可以指定符號常量的值。在這裡我們介紹gcc在編譯的時候,怎麼樣設定符號常量的值,就是通過-d選型來定義。如下是乙個測試例子。
常量與符號常量
通過 數學中的變數與常量 章節的介紹,我們知道了常量的定義,就是其資料不可以修改的量。例如100這個數值,它的數值就是100,不可以改變,所以,稱為常量,可以稱為 常量100。那麼,在c語言中定義的資料報括有數值 整數,浮點數 字元等等。其內容不可改變的量,就稱為常量,有 100,20,30 這樣的...
C 變數 常量 符號常量
變數 int i 0 i 是變數 i 5 i 可以修改 變數就是程式內乙個記憶體位置的符號名,在該記憶體位置可以儲存資料,並可以通過符號名對該記憶體位址存放的資料進行訪問。變數的值可以修改,是可變的,但在某個確定的時刻,變數的值是確定的,並一直保持到下次被修改之前。常量 int a 10 a 是變數...
常量符號定義
1 特點 編譯時符號所在的位置就會替換為它代表的常量 2 偽指令 2.1 語法 name expreion 2.1.1 expression 只能是整數或整數表示式 2.1.2 name 可以重複定義為不同的整數或整數表示式 例如 count 500 size list 3 equ 偽指令 3.1 ...