2012-08-31 55 views
3

我讀的書C++編碼標準:101條規則,準則和最佳實踐,並說,使用#define是不好用。當我查看一些頭文件時,他們有很多#define s。如果使用#define很糟糕,爲什麼會有這麼多?謝謝。C++編碼標準的#define頭文件

+0

大多數在標準頭的那些有合法用途。 C++爲宏的某些用途提供了更好的選擇。 – chris

+3

注意,即使宏一般都不會好於'C使用++',還是應該包括/頭警衛。這是通過使用'#define' – RageD

回答

5

#define是一個不好的做法,因爲:

他們沒有任何範圍:

#define■不要尊重範圍所以沒有方法來創建一個類作用域名稱空間。雖然變量可以在類中作用域。

期間編譯錯誤古怪的神奇數字:

如果您正在使用#define那些由預處理器在預編譯的時候更換所以,如果你在編譯過程中收到一個錯誤,它會令人困惑,因爲該錯誤信息不會指宏的名稱,但該數值,它就會出現一個突然的價值了,一會浪費大量的時間跟蹤下來的代碼。

調試問題:

而且在#2中提到同樣的原因,在調試#define不會提供太多的幫助,真的。

因此,它是更好的主意使用const變量而不是一個#define
它們優於#define在上述所有aspects.Only領域,其中#define可以真正的幫助,在那裏你需要實際的文本替換代碼或定義包括頭警衛。

爲什麼#define被廣泛用於C標準頭文件?這使我腦海

的一個原因是,在C(不像C++)const聲明不產生恆定expressions.Which之前引入在C標準一個不能寫東西可變長度數組裝置像:

const int max_val = 100; 
int foos[max_val]; 

因爲在C max_val不是編譯時間常數,和引入VLA的數組下標之前被需要是編譯時間常數。
所以人們不得不改爲寫爲:

#define MAX_VAL 100 
int foos[MAX_VAL]; 
+0

我明白做。但爲什麼很多標準頭文件都有它們,例如stdlib.h? –

+0

AHHHHH,好吧,我現在明白了。謝謝! –

0

本書的廣泛statment不那麼真實 - #define有宏等地方,但定義常量,現在不使用

#define FOO 257 

是更好的做了一個好主意在

const int FOO=257; 

這允許類型檢查,因爲用#define這成爲有點奇怪

char c=FOO; 
2

什麼這可能指的是定義常量的舊的C方式:

#define MAX_SOMETHING 100 

int x = MAX_SOMETHING; 

這些常量不類型的,他們在的地方使用字符串替換擴大,並使其更難調試因爲一旦源代碼被編譯,就不清楚該定義來自哪裏。

做的更C++的方式是:

const int max_something = 100; 

int x = max_something; 

由於這是一個強類型的值,如果需要的話它是受所有必要的檢查和適當的轉換。

另一個好處是可以將const值放入名稱空間和類中用於組織目的。 A #define是範圍全球性的,所以碰撞是一個問題,導致長名稱以避免衝突的尷尬。

之間consttemplate,允許元編程的C形式本身不這樣做,當需要#define場合的數量是相當減少。它並沒有完全消除,因爲沒有#import指令,你仍然需要添加舊的守衛,以確保事情不包括兩次。

+0

扣;-)和一些字符,所以我可以張貼此 –