0

我有以下代码。我想取消定义PORT之后的5迭代。但是当我运行这个程序时,输出就像

PORT
MOB
PORT
MOB...10 times

所以,如果我想在运行时更改它,我该怎么做。我已经PORTVS 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

4 回答 4

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++ 模板具有许多相同的限制,因此尝试使用它们进行此操作很可能(尽管可能不太确定)结果基本相似。模板确实使您能够根据程序的其余部分检查和修改其结果,但只有一点点。最终,模板参数需要是编译时常量,以便可以在编译时解析模板。

于 2013-11-05T09:04:00.450 回答
2

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

于 2013-11-05T09:03:17.773 回答
1

这是做不到的。

预处理器在编译之前作为源文件的第一遍运行之一。

您不能在程序运行时操作预处理器。请改用普通变量。

于 2013-11-05T09:03:20.250 回答
1

你不能。预处理器在编译之前作为单独的步骤运行。没有办法在运行时进行。

您必须使用正常ifelse处理变量来完成它。

于 2013-11-05T09:03:23.213 回答