尽量使用const、enum、inline代替#define
1、 # define A 1.6
寧可使用編譯器也不使用預處理,原因:
當使用預處理時,記號名稱A也許從未被編譯器看見(因為預處理是在編譯階段進行替換),所以一旦出現編譯錯誤,(如果A被定義在一個非你寫的頭文件內),你肯定對1.6以及它的來源毫不知情,這樣就會因為追蹤它而浪費時間。
因此—>用const替換不會發生這種情況(找編譯錯誤難找的情況)。
# define不能進行安全性類型檢查
【 知識點1】
在頭文件內定義一個常量不變的字符串有兩種方式:
const char* const str = “String”;
const string str(String); //一般選這種形式
【 知識點2】static const
用作類內部static const的初始化問題:
①只有static const int類型的常量才能在類內進行聲明和初始化;
②非static const int類型,使用:類內聲明,類外初始化形式。
2、enum的引出原因
如果你的編譯器不允許使用“const static int class常量”完成類內初始化設定,而且編譯器堅持必須在編譯器期間知道數組的大小,可改用enum。
理論基礎:一個屬于枚舉類型的數值可全充ints被使用。
“`
class A
{
enum { size = 5 };//令Numturns成為 5 的一個記號名稱
int array[size]; //這樣就沒有問題了
}
/*說明:enum的行為某方面說比較像#define而不像const,有時候這正是你想要的。例如:取一個const的地址是合法的,取一個enum的地址是不合法的,而取一個#define的地址通常是不合法的。
【因此】—>如果你不想讓別人的指針或者引用指向你的某個整數常量,enum可以幫助你實現這個約束。此外,enum和#define絕對不會導致非必要的內存分配*/
3、inline函數的引出
# define CALL_BACK(a,b) f((a)>(b)?(a):(b))
無論何時都要記住:必須為宏中的所有實參加上小括號;
但是即便這樣做,有時候錯誤也難以避免。
【總結】
對于單純常量,最好用const、enum替換#define
對于形似函數的宏,最好用inline函數替換#define
總結
以上是生活随笔為你收集整理的尽量使用const、enum、inline代替#define的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何快速将下载好的大量源代码文件加入到V
- 下一篇: c语言框架总结