C++ 宏定義與常量


原文: http://blog.csdn.net/t894690230/article/details/50605021

前言:突然想起很久之前上課時被問及C++ 宏定義與常量的區別,仔細了想了想,並沒有答起(尷尬),這次就簡單總結一下C++宏常量與常量的區別吧。

1. 宏定義

宏定義是C語言提供的三種預處理中的一種,又稱為宏代換、宏替換,簡稱“宏”,用#define定義,如下:

#define Pi 3.1415926
  • 1
  • 1

宏常量沒有類型,它是在編譯前即預編譯階段進行字符替換,就好比如下的例子:

S = PI * r * r
  • 1
  • 1

在預編譯階段,直接將PI替換成3.1415926,同時沒有類型安全檢查,系統也不會為它分配內存。

宏定義使用#undef符號終止宏定義的作用域。

2. 常量

常量則是一種標識符,它的值在運行期間恆定不變。常量使用關鍵字const定義,如下:

const float PI = 3.14159;
  • 1
  • 1

常量是在運行時進行替換,並且在編譯時會進行嚴格的類型檢驗,同時系統也會為常量分配內存。

3. 區別

如上所述,C++語言可以用const 來定義常量,也可以用#define來定義宏常量。但是兩者的區別在於:

  • const 常量有數據類型,而宏常量沒有數據類型;
  • const 常量在運行時進行替換,宏常量則是在預編譯截斷進行替換,const 常量在編譯階段會進行類型安全檢查,宏常量則不會;
  • 有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試。

4. 附錄

在實際使用中,由於宏常量在預編譯時只是進行簡單的字符替換,而不會進行編譯檢查,所有應該特別注意宏常量的使用,譬如如下代碼:

#define N 3 + 2 float a = 2 * N
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

預想的值應該是a=10,但實際結果卻是a=8,這是因為宏常量N在預編譯階段直接將字符替換,變成了如下代碼:

float a = 2 * 3 + 2
  • 1
  • 1

這也叫宏定義的“邊緣效應”。

另外根據規則5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM