我通過閱讀Greg Perry編寫的C by example一書來教給自己C語言,並且剛完成第6章「預處理器指令」。 在每章結尾處,都有完成的複習練習(以確保您瞭解該主題正在討論的內容以及如何應用)。這是使用#define的最佳方式嗎?
我正在爲第6章進行第4次複習練習,我想知道這是否是正確的做法? (這次演習是在畫面的頂部開始寫。)
我的問題:這是完成練習的最佳方式,或者是有這是很多更高效更簡單的方法?
我通過閱讀Greg Perry編寫的C by example一書來教給自己C語言,並且剛完成第6章「預處理器指令」。 在每章結尾處,都有完成的複習練習(以確保您瞭解該主題正在討論的內容以及如何應用)。這是使用#define的最佳方式嗎?
我正在爲第6章進行第4次複習練習,我想知道這是否是正確的做法? (這次演習是在畫面的頂部開始寫。)
我的問題:這是完成練習的最佳方式,或者是有這是很多更高效更簡單的方法?
使用#define
最好的辦法是應該不再使用:)
但是,如果你堅持要用#define
,你應該記住的是,宏的擴展不尊重的特徵的示例宏的邊界。它只是將令牌插入輸入流。所以你必須總是用圓括號包圍表達式,如果宏需要參數,你也應該用圓括號包圍它們。
你的情況:
#define TOTAL (NO0 + NO1 + NO2 + NO3 + NO4 + NO5 + NO6 + NO7 + NO8 + NO9)
如果你不這樣做,那麼你會在結果感到驚訝,例如,TOTAL/10
,這與你的定義會導致36代替預計4
同理:如果你調用它,例如
#define SQUARE(x) x * x
不會產生正確的結果,SQUARE(y + 1)
。您需要使用:
#define SQUARE(x) ((x) * (x))
即使如此,你會發現,可以是一個驚喜,如果你把它作爲SQUARE(y++)
。
所有這些問題都可以通過避免使用宏來避免。現在,您可以依靠現代編譯器來優化代碼而無需使用宏。
發佈代碼,而不是代碼的圖片。 – melpomene
簡答:沒有。 –
查看http://codereview.stackexchange.com/。 – melpomene