【02】儘量以const,enum,inline替換#define

Andy Niu發表於2014-01-08

1、考慮為什麼?

  首先,#define不是語言的一部分,而是預編譯過程。也就是在編譯器編譯之前,進行文字替換。考慮#define Pi 3.1425;在編譯之前,Pi都會被文字替換為3.1415,因此編譯器看不到Pi這個標識。這會增加除錯難度。同時文字替換導致目標碼中出現多份3.1415。

2、儘量不使用#define,就要使用替代辦法。

3、對於#define Pi 3.1415這樣形式,使用const替換const double Pi = 3011415;以const替換#define,有兩個特殊情況:

  a、定義常量指標,使用兩個const,限制指向物件不能修改,指向不能修改;

  b、class專屬常量,它表示的意義是把常量的作用域限制在class內,同時為了該常量只有一份例項,讓所有物件共享,宣告為static成員。在類中:static const int Max= 100;注意:這是一個宣告,而不是定義。我們知道,C++要求對於使用的任何東西必須提供一個定義式,但是對於class專屬常量,並且是static同時是整數性的情況,是個例外,也就是說,這種情況不需要定義,就可以使用。但是,如果要娶它的地址,還是要定義一下。

4、舊式編譯器可能不支援const-static-int的宣告語法,因此必須定義。在類內部,陣列必須編譯時確定大小,需要使用這個值,怎麼辦?使用enum。需要說明,使用#define和enum,取它們的地址往往不合法。而取const物件是合法的。

5、#define的另一個用法就是巨集,巨集表面上是方法,但沒有方法呼叫的額外開銷,因為它是文字替換。這往往會出現意想不到的Bug,應該使用inline替換。

6、儘量使用#define的替代品,但並不能完全消除#define,有些地方還必須使用,比如:#ifndef,__LINE__等。

相關文章