2016-08-03 68 views
0

如果我定義在C++ 98方案如下:預移位器會評估位移和算術運算嗎?

#define BITS_PER_FOO 2 
#define BITS_PER_BAR 3 
#define FOOBARS (1<<(BITS_PER_FOO*BITS_PER_BAR)) 

然後將FOOBARS得到由預編譯評價爲64?或者,我將在代碼中使用FOOBARS的每個位置進行乘法和位移操作?

+0

您的意思是預處理器?預處理器只是用'(1 <<(2 * 3))'替換'FOOBARS'。編譯器然後在編譯時將此表達式優化爲64。 – DaBler

回答

0

乘法和位移操作將發生在您使用FOOBARS的每個位置。

參見:#define Directive (C/C++)

#define形式的宏,這意味着該標識符替換爲在令牌字符串的一切。在你的情況下,預處理器用(1<<(BITS_PER_FOO*BITS_PER_BAR))

2

替換FOOBARS的實例否,因爲它不是預處理器的業務。它做通常的替代物品,而不是經常摺疊。

但是,任何合理的編譯器都會進行不斷的摺疊,因此您不應該期望它與運行時正在執行的指令相對應。

2

預編譯器只是進行文本替換 - 它本質上是拷貝&粘貼在類固醇上。這意味着您爲FOOBAR編寫的表達式將在每個替換位置完整展開。

現在,任何體面的編譯器都會在編譯時評估整個子表達式。然而,你可以保存它的一些工作(並且有一些額外的優點,比如有一個明確的表達類型,更明確的診斷,從錯誤位置替換得到的更少的意外,並且對於常量而不是表達式有一個實際的左值)將這些值定義爲實際常數,如:

const int bits_per_foo = 2; 
const int bits_per_bar = 3; 
const int foobars = 1<<(bits_per_foo*bits_per_bar);