我讀的書C++編碼標準:101條規則,準則和最佳實踐,並說,使用#define
是不好用。當我查看一些頭文件時,他們有很多#define
s。如果使用#define
很糟糕,爲什麼會有這麼多?謝謝。C++編碼標準的#define頭文件
回答
#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];
我明白做。但爲什麼很多標準頭文件都有它們,例如stdlib.h? –
AHHHHH,好吧,我現在明白了。謝謝! –
本書的廣泛statment不那麼真實 - #define
有宏等地方,但定義常量,現在不使用
如
#define FOO 257
是更好的做了一個好主意在
const int FOO=257;
這允許類型檢查,因爲用#define這成爲有點奇怪
char c=FOO;
什麼這可能指的是定義常量的舊的C方式:
#define MAX_SOMETHING 100
int x = MAX_SOMETHING;
這些常量不類型的,他們在的地方使用字符串替換擴大,並使其更難調試因爲一旦源代碼被編譯,就不清楚該定義來自哪裏。
做的更C++的方式是:
const int max_something = 100;
int x = max_something;
由於這是一個強類型的值,如果需要的話它是受所有必要的檢查和適當的轉換。
另一個好處是可以將const
值放入名稱空間和類中用於組織目的。 A #define
是範圍全球性的,所以碰撞是一個問題,導致長名稱以避免衝突的尷尬。
之間const
和template
,允許元編程的C形式本身不這樣做,當需要#define
場合的數量是相當減少。它並沒有完全消除,因爲沒有#import
指令,你仍然需要添加舊的守衛,以確保事情不包括兩次。
扣;-)和一些字符,所以我可以張貼此 –
- 1. 的#define __CLIBNS ::的std ::在C標準的頭文件,如stdio.h中
- 2. C++頭文件#define編譯器錯誤
- 3. 預編譯標準庫頭文件 - C++
- 4. C++標準頭文件
- 5. C/C++標準中的頭文件?
- 6. C++編碼標準
- 7. C++和C編碼標準#
- 8. C和C++編碼標準
- 9. 在頭文件中使用「#define」C
- 10. c標準頭文件對應的代碼在哪裏?
- 11. Objective-C編碼標準?
- 12. 頭文件和標準庫
- 13. C頭文件和源文件的標準結構
- 14. 編碼標準
- 15. 用R頭文件編譯C代碼
- 16. 如何從C++頭文件讀#define的C#
- 17. 在C++中包含非標準C頭文件
- 18. #define在.mm文件中未識別的預編譯頭中
- 19. 在英特爾編譯器中使用不同的標準C++庫頭文件
- 20. Java編碼標準
- 21. PHP編碼標準
- 22. Excel標準編碼
- 23. ZF2編碼標準
- 24. XSLT編碼標準
- 25. Silverlight編碼標準
- 26. LessCSS編碼標準
- 27. JavaScript編碼標準
- 28. CodeIgniter編碼標準
- 29. PHP編碼標準
- 30. Objective-C編碼標準[iPhone/Cocoa]
大多數在標準頭的那些有合法用途。 C++爲宏的某些用途提供了更好的選擇。 – chris
注意,即使宏一般都不會好於'C使用++',還是應該包括/頭警衛。這是通過使用'#define' – RageD