天天看點

C/C++定義常量#define與const比較

1。const定義常量是有資料類型的,而#define宏定義常量卻沒有。

這樣const定義的常量編譯器可以對其進行資料靜态類型安全檢查,而#define宏定義的常量卻隻是進行簡單的字元替換,沒有類型安全檢查,且有時還會産生邊際效應(不如你願處)。所謂邊際效應舉例如下:

          #define N 100

          #define M 200 + N

          當程式中使用 M*N 時,原本想要 100 * (200+ N )的卻變成了 100 * 200 + N。

const檢查定的類型,如 const float pi = 3.141592653,實際的pi是3.141593,因為float類型的有效位限制。

3。當定義局部變量時,const作用域僅限于定義局部變量的函數體内。但用#define時其作用域不僅限于定義局部變量的函數體内,而是從定義點到整個程式的結束點。但也可以用#undef取消其定義進而限定其作用域範圍。(這是#define的優點)

4。C中的#define和C++中的const都可以定義常量。

在ANSI C 語言中用什麼來定義常量呢?答案是enum類型和#define宏,這兩個都可以用來定義常量,一般不用const。?

5。#define也可以定義帶參數的宏,C++中使用inline函數來代替。

6。#define任意定義,而const是有類型要求,根據不同的情況,使用不同的定義方式。在有些場合,const跟#define都能做到,但const做的更好,更健壯;在有些場合,#define能做到,const做不到

C const與#define相比有何優點

  • const常量有資料類型,而宏常量沒有資料類型。編譯器可以對前者進行類型安全檢查。而#define 隻作簡單的字元串替換,無類型安全檢查。
  • const在編譯時配置設定存儲空間;而#define在預編譯時編譯,不配置設定存儲空間。
  • 有些內建化的調試工具可以對const進行調試,但不能對宏進行調試。