讀古今文學網 > C語言解惑 > 7.1 用const代替無參數的宏定義 >

7.1 用const代替無參數的宏定義

自從推出const,就建議用它代替無參數的宏來定義常量。

【例7.1】下面的程序設計使用了宏定義,找出錯誤的地方。


#include <stdio.h>
#define NUM =3
void main
()
{
      int i
,sum=0
;
      for
(i=NUM
;i>0
;i--
)
      {
           sum++
;
           printf
("%d
:Welcome
!\n"
,sum
);
      }
}
  

由於定義時多了一個「=」號,所用NUM變成「=3」,for語句的替代變成


for
(i==3
;i>0
;i--
)
  

賦值符「=」變成比較符「==」,編譯系統會給出出錯信息。

現在不建議使用宏定義常量,推薦使用const。


#include <stdio.h>
int const NUM =3
;
void main
()
{
      int i
,sum=0
;
      for
(i=NUM
;i>0
;i--
)
      {
          sum++
;
          printf
("%d
:Welcome
!\n"
,sum
);
      }
}
  

運行結果如下。


1
:Welcome
!
2
:Welcome
!
3
:Welcome
!
  

像這類程序,如果只是主函數使用它,更推薦在程序中定義。例如:


#include <stdio.h>
void main
()
{
      int const NUM=3
;
      int i
,sum=0
;
      for
(i=NUM
;i>0
;i--
)
      {
          sum++
;
          printf
("%d
:Welcome
!\n"
,sum
);
      }
}
  

【例7.2】分析下面程序的錯誤及其輸出結果。


#include <stdio.h>
#define P1 5
#define P2 15
#define PP P1+P2
#define SIDE 25
#define AREA PP*SIDE
void main
()
{
     printf
("The area is %d\n"
,AREA
);
}
  

C語言的編譯器不能理解宏定義裡的語法,即不理解這裡的加運算,所以只能把它定義為「5+15」,替代後成為


#define AREA  5+15*25
  

所以輸出是380。應該將它們括起來,即正確的定義為


#define  PP 
(P1+P2
)
  

或者使用const定義為


int const PP=P1+P2
;
  

const可以為表達式,從而輸出如下的正確結果「The area is 500」。

const的用處不僅僅是在常量表達式中代替宏定義。如果一個變量在生存期中的值不會改變,就應該用const來修飾這個變量,以提高程序的安全性。

【例7.3】有人說下面的程序輸出是1350,原因是宏定義是30*45=1350。對嗎?


#include <stdio.h>
int const SIDE=30
;int HIGHT=45
;
#define AREA SIDE*HIGHT
void main
()
{
     HIGHT=90
;
     printf
("The area is %d\n"
,AREA
);
}
  

不對。在執行printf之前,已經修改了HIGHT的值,所以輸出為


2700
  

如果將上面的程序修改為如下程序:


#include <stdio.h>
int const SIDE=30
,HIGHT=45
;
#define AREA SIDE*HIGHT
void main
()
{
     printf
("The area is %d\n"
,AREA
);
}
  

程序輸出:


1350
  

【例7.4】分析下面的程序不能通過編譯的原因。


#include <stdio.h>
#define SIDE 15
, HIGHT 30
#define AREA SIDE*HIGHT
void main
()
{
     printf
("The area is %d\n"
,AREA
);
}
  

在程序中,可以用一種數據類型在一行中定義多個同類型的變量。例如下面的定義


int const SIDE=30
,HIGHT=45
;
  

是正確的,SIDE和HIGHT都是整型常量,但宏定義一行只允許定義一個,所以定義


#define SIDE 15
, HIGHT 30
  

是錯誤的。如果是下面的定義形式:


#define CH  "AB" "CD" "EFG"
  

則CH的值變為字符串ABCDEFG。

可用下面的程序驗證它們的用法。


#include <stdio.h>
#define SIDE 15
#define HIGHT 30
#define AREA SIDE*HIGHT
#define CH  "AB" "CD" "EFG"
void main
()
{
     printf
("The area is %d.\n"
, AREA
);
     printf
(CH
);printf
("\n"
);
}
  

程序輸出結果如下。


The area is 450.
ABCDEFG