[英]Does C preprocessor directives recompute each time?
我有這行代碼:
#define ALPHABET_SIZE 'z' - 'a' + 1
當我將鼠標懸停在代碼中的任何地方 ALPHABET_SIZE 上時,它告訴我它擴展為'z' - 'a' + 1
。 所以我想知道每次在我的代碼中使用 ALPHABET_SIZE 時是否必須重新計算這個表達式? 如果是這樣,我怎樣才能防止重新計算?
#define ALPHABET_SIZE 'z' - 'a' + 1
預處理器替換每個ALPHABET_SIZE
和
'z' - 'a' + 1
然后編譯器很可能會執行常量折疊優化,用 26 替換計算。
Demo https://godbolt.org/z/Mo46db ,表達式用gcc 10.2替換為26
C 標准僅指定程序的可觀察行為,而不指定它們在幕后如何工作。
是否每次都重新計算'z' - 'a' + 1
不會影響可觀察行為,因此由實現來決定。
通常,您可以期望合理的編譯器在編譯時計算結果,尤其是在啟用優化時。
考慮以下程序:
#define ALPHABET_SIZE 'z' - 'a' + 1
#include <stdio.h>
int main(void)
{
printf("%d\n", 2*ALPHABET_SIZE);
printf("%d\n", ALPHABET_SIZE*2);
}
在我的 C 實現中,這會打印“148”和“27”。 發生這種情況是因為,在第一個printf
, 2*ALPHABET_SIZE
被替換為2*'z' - 'a' + 1
,它被評估為(2*'z') - 'a' + 1
,並且在第二個中printf
, ALPHABET_SIZE*2
被替換為'z' - 'a' + 1*2
,計算結果為'z' - 'a' + (1*2)
。 由於它們產生了兩種不同的結果,證明了用C語義進行預處理並不能用一次計算的單個表達式結果代替宏; 它必須產生其他東西(實際上是一系列預處理器標記),隨后在上下文中重新解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.