如果我定義在C++ 98方案如下:預移位器會評估位移和算術運算嗎?
#define BITS_PER_FOO 2
#define BITS_PER_BAR 3
#define FOOBARS (1<<(BITS_PER_FOO*BITS_PER_BAR))
然後將FOOBARS
得到由預編譯評價爲64?或者,我將在代碼中使用FOOBARS
的每個位置進行乘法和位移操作?
如果我定義在C++ 98方案如下:預移位器會評估位移和算術運算嗎?
#define BITS_PER_FOO 2
#define BITS_PER_BAR 3
#define FOOBARS (1<<(BITS_PER_FOO*BITS_PER_BAR))
然後將FOOBARS
得到由預編譯評價爲64?或者,我將在代碼中使用FOOBARS
的每個位置進行乘法和位移操作?
乘法和位移操作將發生在您使用FOOBARS
的每個位置。
#define
形式的宏,這意味着該標識符替換爲在令牌字符串的一切。在你的情況下,預處理器用(1<<(BITS_PER_FOO*BITS_PER_BAR))
替換FOOBARS
的實例否,因爲它不是預處理器的業務。它做通常的替代物品,而不是經常摺疊。
但是,任何合理的編譯器都會進行不斷的摺疊,因此您不應該期望它與運行時正在執行的指令相對應。
預編譯器只是進行文本替換 - 它本質上是拷貝&粘貼在類固醇上。這意味着您爲FOOBAR
編寫的表達式將在每個替換位置完整展開。
現在,任何體面的編譯器都會在編譯時評估整個子表達式。然而,你可以保存它的一些工作(並且有一些額外的優點,比如有一個明確的表達類型,更明確的診斷,從錯誤位置替換得到的更少的意外,並且對於常量而不是表達式有一個實際的左值)將這些值定義爲實際常數,如:
const int bits_per_foo = 2;
const int bits_per_bar = 3;
const int foobars = 1<<(bits_per_foo*bits_per_bar);
您的意思是預處理器?預處理器只是用'(1 <<(2 * 3))'替換'FOOBARS'。編譯器然後在編譯時將此表達式優化爲64。 – DaBler