为了是否无论何时#定义正在使用其他的#define?

问题描述 投票:23回答:4

根据答案this question,下面的代码是合法的:

#define three 3
#define nine three*3

int main()
{
    std::cout << nine;
    return 0;
}

而且肯定的是,它编译并运行良好。然而,答案中提到的问题还规定一个人应该小心这样#define指令的顺序,而这将在其他#defines使用前面都要定义。但是,下面的代码:

#define nine three*3
#define three 3

int main()
{
    std::cout << nine;
    return 0;
}

此外编译并运行正常,并打印“9”。

是我的编译器让我掉容易,还是订单确实不使用其他#defines的#define有关系吗?请问上编译失败更复杂的项目?

有一两件事值得一提的是,所提到的问题讲的C,而我的代码是C ++。是其中的行为(应该)差异从何而来?

c++ c-preprocessor operator-precedence
4个回答
8
投票

three宏不需要使用nine宏之前只定义。你甚至可以在每次使用three之前更改nine

#define nine three*3
#define three 3

int main()
{
    std::cout << nine; //9
#undef three
#define three 4
    std::cout << nine; //12
#undef three
    //no `three` macro defined here
    int three = 2;
    std::cout << nine; //three * 3 == 6
    return 0;
}

3
投票

这个步骤将在预处理步骤中完成,所有的文字将与他们的价值所取代。这可如果我们用选项编译验证:

$ G ++ - 保存 - 临时工basic.cpp -o出来

这是预处理器步骤(basic.ii文件)之后的输出:

int main()
{
    std::cout << 3*3;
    return 0;
}

为您的样品程序。所以,为了不应该是事情,因为它是一种查找和替换,它是越来越之前,该方案的实际编译完成。


3
投票

预处理程序所做的多次运行,只有当发现所有定义的任何其他事件结束。因此,你的代码示例都工作,但预处理器需要在第二个的情况下,多一个运行。你必须要小心递归定义。竞价排名则永远不会退出。


0
投票

其实这是因为两个步骤的解析器。在第一步骤中它尝试解决所有的符号和在第二步骤中的实际值被放置。

© www.soinside.com 2019 - 2024. All rights reserved.