iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

Effective C++ 讀書筆記系列 第 3

[Day 3] Prefer const, enum, and inline to #define (1)

  • 分享至 

  • xImage
  •  

前言

前一天熱身完畢,今天的內容比較豐富了。邊看也邊補充一些基本知識。

使用const取代#define

來看第二條準則:

Prefer "const", "enum", and "inline" to "#define"

這個說法其實是背後的意思是: prefer compiler> preprocessor
簡單來說:

  • compiler─編譯器
  • preprocessor─前置處理器

前置處理器比編譯器還更前面,先處理過才會再給編譯器,#define這些macro的內容就是在經過前置處理器轉換過後被代換掉,才會傳遞給前置處理器。
#define像是不在該語言本身,編譯器根本不知道這些macro的內容,所以編譯器報錯的時候顯示的會是轉換過後的內容,會造成難以debug。解決辦法就是用const來取代macro,因為編譯器看得到const的內容,他是有被存到symbol table裡面的。
在用const來取代#define的時候有兩個注意事項:

  1. pointer的使用:有時候pointer除了指向的地方要被定義成const,它本身也要被定義成const,例如在定義字串的時候const就要被寫兩遍,像這樣:
const char * const authorName = "Scott Meyers";

(關於const+pointer的使用下一個準則還會再提到),那此時不如這樣寫:

const std::string authorName("Scott Meyers");
  1. classes專屬的const:為了讓該const只跟特定的class掛勾,會讓它變成class的member;然而為了讓它不要有多餘的copy,就把它變成static的member。例如這樣
class GamePlayer
{
private:
    static const int NumTurns = 5;
}

這邊對於NumTurns的用法是"宣告"而非"定義",有些比較早期的編譯器不接受在宣告的時候定義初始值,另外這種用法也只能用在整數常數,如果不是以上情形,就需要改在定義的地方指定值。(就是把他們拆開)

class GamePlayer
{
private:
    static const int NumTurn;
}

const int GamePlayer::NumTurn = 5; // in implementation file

另外跟class有掛勾的const更永遠不應該被用#define的用法,因為#define沒辦法指定範圍,沒辦法被封裝。

心得

今天邊看邊補充的內容多了一點,明日繼續。

補充

(皆取自參考資料)

  • const: const關鍵字指定變數的值是常數,並告訴編譯器防止程式設計人員修改它。
  • #define: The #define creates a macro, which is the association of an identifier or parameterized identifier with a token string. After the macro is defined, the compiler can substitute the token string for each occurrence of the identifier in the source file.
  • 簡單來說程式的轉換流程如下: source code> preprocessor> compiler> assembler> object code> linker> executables
  • Compile time vs Runtime (雖然跟這章節沒有關係): Compile-time and Runtime are the two programming terms used in the software development. Compile-time is the time at which the source code is converted into an executable code while the run time is the time at which the executable code is started running.

參考資料


上一篇
[Day 2] View C++ as a federation of languages
下一篇
[Day 4] Prefer const, enum, and inline to #define(2)
系列文
Effective C++ 讀書筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言