如何在运行时取消undef和def预处理器值

时间:2013-11-05 08:59:41

标签: c++ c visual-studio-2010

我有以下代码。 我希望在PORT次迭代后取消5。但是当我运行这个程序时,输出就像

PORT
MOB
PORT
MOB...10 times

所以,如果我想在运行时更改它,我该怎么做呢。 我在PORT

中声明了VS project->Propoties->C/C++->Preprocessor
int main()
{
    int i;
    for(i = 0; i <= 10; i++)
    {
#ifdef PORT
        printf("PORT\n");
#endif
        if(i == 5)
        {
#ifdef PORT
#undef PORT
#endif
#define MOB 1
        }
#if MOB
        printf("MOB\n");
#endif
    }
    return 0;
}

4 个答案:

答案 0 :(得分:3)

预处理器(如名称所示)在编译时执行与第一个步骤相同的操作(或者,根据您的观点,完全编译之前)。在运行时发生的事情无法控制先前发生的事情。您无法在运行时更改预处理器完成的任何操作。

要获得所需的效果,您可以从尝试使用预处理器定义更改为使用普通变量或正常流量控制。

for (int i=0; i<5; i++)
    printf("PORT\n");

for (int i=0; i<5; i++)
    printf("MOB\n");

...或:

for (int i=0; i<10; i++)
   printf(i < 5 ? "PORT\n", "MOB\n");

虽然你没有提到它们,但我会补充一点,C ++模板有很多相同的限制,所以尝试用它们做这件事是可能(尽管可能不太确定)转向基本相似的。模板确实为您提供了更多能力,可以根据程序的其余部分检查和修改结果,但只有一点点。最终,模板参数需要是编译时常量,因此模板可以在编译时解析。

答案 1 :(得分:2)

这是不可能的。预处理程序指令是编译的一部分。没有运行时预处理器这样的东西,你不能在运行时更改指令。二进制文件不知道预处理程序指令。

答案 2 :(得分:1)

这不可能。

预编译器在编译之前作为源文件的第一个传递之一运行。

您无法在程序运行时操作预处理器。改为使用普通变量。

答案 3 :(得分:1)

你做不到。 编译之前,预处理器作为单独的步骤运行。没有办法运行它。

您必须使用正常ifelse处理变量来执行此操作。