如何在运行时取消定义和定义预处理器值

How can I undef and def preprocessor value at run time

本文关键字:定义 预处理 处理器 取消 运行时      更新时间:2023-10-16

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

PORT
MOB
PORT
MOB...10 times

所以,如果我要在运行时更改它,我该怎么做。我已经在VS project->Propoties->C/C++->Preprocessor中宣布PORT

int main()
{
    int i;
    for(i = 0; i <= 10; i++)
    {
#ifdef PORT
        printf("PORTn");
#endif
        if(i == 5)
        {
#ifdef PORT
#undef PORT
#endif
#define MOB 1
        }
#if MOB
        printf("MOBn");
#endif
    }
    return 0;
}

预处理器(如名称所暗示的那样)在编译的第一步(或者,根据您的观点,在完全编译之前)执行它所做的事情。运行时发生的事情无法控制以前发生的事情。您无法在运行时更改预处理器执行的任何操作。

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

for (int i=0; i<5; i++)
    printf("PORTn");
for (int i=0; i<5; i++)
    printf("MOBn");

。或:

for (int i=0; i<10; i++)
   printf(i < 5 ? "PORTn", "MOBn");

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

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

这做不到。

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

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

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

您必须使用正常的if和对变量的else处理来做到这一点。