簡體   English   中英

C 預處理器指令是否每次都重新計算?

[英]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”。 發生這種情況是因為,在第一個printf2*ALPHABET_SIZE被替換為2*'z' - 'a' + 1 ,它被評估為(2*'z') - 'a' + 1 ,並且在第二個中printfALPHABET_SIZE*2被替換為'z' - 'a' + 1*2 ,計算結果為'z' - 'a' + (1*2) 由於它們產生了兩種不同的結果,證明了用C語義進行預處理並不能用一次計算的單個表達式結果代替宏; 它必須產生其他東西(實際上是一系列預處理器標記),隨后在上下文中重新解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM