预处理器常量评估
Preprocessor constant evaluation
我有一个关于 C 中预处理器常量的小问题。我了解这种 "variable" 的目标是什么以及它是如何工作的。但是,我对他们的评价有一个小问题。让我们考虑一个小例子:
#define MY_VARIABLE 5
int main() {
int test1 = MY_VARIABLE*5;
int test2 = 5;
int test3 = MY_VARIABLE*test2;
}
在预处理器步骤中,MY_VARIABLE
将在代码中替换为 5。我的问题是: test1
会在编译期间或执行期间计算吗? test3
将在执行期间计算是否正确?这个问题可能看起来有点奇怪和无用,但我正在研究一个程序,其中这种事情做了很多次,我想知道这种操作是否会减慢执行速度。
如您所知,C 预处理器只是在实际编译发生之前替换宏,因此我删除了所有与预处理器相关的内容。
在这个代码中,在执行期间没有计算发生,因为编译器在编译期间计算 5*5 并且通过推断也可以在编译期间计算所有其他常量:
int main() {
int test1 = 5 * 5;
int test2 = 5;
int test3 = 5 * test2;
}
前面代码片段的确切等价物是:
int main() {
int test1 = 25;
int test2 = 5;
int test3 = 25;
}
但是在下面的代码中 test3
是在 运行 期间求值的,因为 test2
的值无法在编译期间确定,因为它取决于 return SomeFunction
的值只能在 运行 时间知道。
int main() {
int test1 = 5 * 5;
int test2 = SomeFunction();
int test3 = 5 * test2;
}
我有一个关于 C 中预处理器常量的小问题。我了解这种 "variable" 的目标是什么以及它是如何工作的。但是,我对他们的评价有一个小问题。让我们考虑一个小例子:
#define MY_VARIABLE 5
int main() {
int test1 = MY_VARIABLE*5;
int test2 = 5;
int test3 = MY_VARIABLE*test2;
}
在预处理器步骤中,MY_VARIABLE
将在代码中替换为 5。我的问题是: test1
会在编译期间或执行期间计算吗? test3
将在执行期间计算是否正确?这个问题可能看起来有点奇怪和无用,但我正在研究一个程序,其中这种事情做了很多次,我想知道这种操作是否会减慢执行速度。
如您所知,C 预处理器只是在实际编译发生之前替换宏,因此我删除了所有与预处理器相关的内容。
在这个代码中,在执行期间没有计算发生,因为编译器在编译期间计算 5*5 并且通过推断也可以在编译期间计算所有其他常量:
int main() {
int test1 = 5 * 5;
int test2 = 5;
int test3 = 5 * test2;
}
前面代码片段的确切等价物是:
int main() {
int test1 = 25;
int test2 = 5;
int test3 = 25;
}
但是在下面的代码中 test3
是在 运行 期间求值的,因为 test2
的值无法在编译期间确定,因为它取决于 return SomeFunction
的值只能在 运行 时间知道。
int main() {
int test1 = 5 * 5;
int test2 = SomeFunction();
int test3 = 5 * test2;
}