2016-07-28 84 views
-4

我通過閱讀Greg Perry編寫的C by example一書來教給自己C語言,並且剛完成第6章「預處理器指令」。 在每章結尾處,都有完成的複習練習(以確保您瞭解該主題正在討論的內容以及如何應用)。這是使用#define的最佳方式嗎?

我正在爲第6章進行第4次複習練習,我想知道這是否是正確的做法? (這次演習是在畫面的頂部開始寫。)

The code I wrote for the exercise

我的問題:這是完成練習的最佳方式,或者是有這是很多更高效更簡單的方法?

+8

發佈代碼,而不是代碼的圖片。 – melpomene

+2

簡答:沒有。 –

+2

查看http://codereview.stackexchange.com/。 – melpomene

回答

1

使用#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++)

所有這些問題都可以通過避免使用宏來避免。現在,您可以依靠現代編譯器來優化代碼而無需使用宏。

相關問題