预处理器常量评估

时间:2016-04-27 08:53:36

标签: c compilation c-preprocessor

我对C中的预处理器常量有一个小问题。我理解这种“变量”的目标是什么以及它是如何工作的。但是,我对他们的评价提出了一个小问题。让我们考虑一个小例子:

#define MY_VARIABLE 5

int main() {
    int test1 = MY_VARIABLE*5;
    int test2 = 5;
    int test3 = MY_VARIABLE*test2;
}

在预处理器步骤中,MY_VARIABLE将在代码中替换为5。我的问题是:在编译期间或执行期间会计算test1吗?在执行期间计算test3是否正确?这个问题可能看起来有点奇怪和无用,但我正在研究一个程序,这种事情已经做了很多次,我想知道这种操作是否会减慢执行速度。

1 个答案:

答案 0 :(得分:1)

正如您已经了解的那样,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的值,因为它取决于只能SomeFunction的返回值在运行时知道。

int main() {
    int test1 = 5 * 5;
    int test2 = SomeFunction();        
    int test3 = 5 * test2;
}