在 C++ 中,可使用 inline function 取代函式巨集的功能。
函式區集有一個非常嚴重的問題:
在定義巨集時,若參數出現不只一次,
就可能不只一次被計算到。
舉例來說:
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
c 這個參數出現了2次,
如果在這種情況被呼叫的話,
while(isupper(c = getchar())) {}
那麼每當某個輸入字元大於或等於A時,
接下來會再讀取一個字元來與Z比較。
這樣兩次比較的便是不同的c字元。
函式巨集應該只有在它們保證每個引數只被計算一次的前提下才可以使用,
所以上述的例子應該用兩個表示式來重寫,
while((c = getchar()) != EOF && isupper(c)) {}
另外,
有時候多次求值雖不會產生錯誤,
但有可能引發效能上的問題,
或是因展開巨集而使編譯出來的程式變得更大,
這些都要留意!
0 意見:
張貼留言