2014-04-08 40 views
1

取代的宏我想更換懷疑與靜態常量varaible

#define SomeValue ':' 

static const uint8_t SomeValue = ':'; 

我懷疑這個更換,用,是不是正確的,以取代這個宏與靜態常量?

+0

爲什麼不是'char'?我不認爲你需要「靜態」。 – crashmstr

+0

通過查看,它是正確的 –

+0

是的。宏是邪惡的,但並非總是如此。但在你的情況下不要使用宏。 – DumbCoder

回答

2

斯科特邁爾斯有效C++

項目1:不想常量和內聯到#定義。

這個項目可能更好地被稱爲「更喜歡編譯器的預處理器」,因爲#define經常被視爲它本身不是語言的一部分。這是它的一個問題。當你做這樣的事情,

#define ASPECT_RATIO 1.653 

符號名ASPECT_RATIO可能永遠不會被編譯器可以看到;它可能會在源代碼進入編譯器之前被預處理器刪除。因此,名稱ASPECT_RATIO可能無法輸入到符號表中。如果在使用常量的編譯期間出現錯誤,這可能會引起混淆,因爲錯誤消息可能指向1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO在您未寫入的頭文件中定義,那麼您不知道1.653來自哪裏,而且您可能會浪費時間來追蹤它。這個問題也可能在符號調試器中出現,因爲再次,您編程的名稱可能不在符號表中。

這個抱歉的情況的解決方案簡單而簡潔。代替使用預處理器宏的,定義一個常數:

const double ASPECT_RATIO = 1.653; 

在同樣

香草薩特,安德烈Alexandrescu的 C++編碼標準:101條規則,準則,和最佳實踐

16.避免宏

宏仍然是一些重要任務的唯一解決方案,如#include警衛定義用於條件編譯的和#if,並執行斷言。

對於條件編譯(例如,依賴於系統的部分),避免亂拋垃圾代碼#ifdef s。相反,更願意組織代碼,以便使用宏驅動一個通用接口的替代實現,然後在整個接口中使用該接口。

當替代方法是極端複製和粘貼代碼片段時,您可能希望使用宏(謹慎)。

+1

還有類型安全性,你總是確定你正在使用什麼(就類型檢查而言) –