C 预处理器指令是否每次都重新计算?

Alg*_*lgo 1 c preprocessor compiler-directives

我有这行代码:

#define ALPHABET_SIZE 'z' - 'a' + 1
Run Code Online (Sandbox Code Playgroud)

当我将鼠标悬停在代码中的任意位置 ALPHABET_SIZE 上时,它告诉我它扩展到'z' - 'a' + 1. 所以我想知道每次在我的代码中使用 ALPHABET_SIZE 时是否必须重新计算这个表达式?如果是这样,我怎样才能防止重新计算?

Ton*_*ous 5

#define ALPHABET_SIZE 'z' - 'a' + 1
Run Code Online (Sandbox Code Playgroud)

预处理器替换每个 ALPHABET_SIZE

'z' - 'a' + 1
Run Code Online (Sandbox Code Playgroud)

然后编译器很可能会执行常量折叠优化,用 26 替换计算。


Demo https://godbolt.org/z/Mo46db,表达式替换为26gcc 10.2