C语言 我如何在运行时undef和def预处理器值?

px9o7tmv  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(88)

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

PORT
MOB
PORT
MOB...10 times

那么,如果我想在运行时更改它,我该怎么做呢?
我在Visual Studio项目中声明了PORTPropertiesC/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;
}
dfuffjeb

dfuffjeb1#

预处理器(顾名思义)在编译中的第一步(或者,根据您的观点,在编译完成之前)完成它所做的事情。在运行时发生的事情不能控制以前发生的事情。您不能在运行时更改预处理器所做的任何事情。
要获得所需的效果,您可以从尝试使用预处理器定义改为使用普通变量或普通流控制。

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

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

. or:

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

虽然你没有提到它们,但我要补充的是,C++模板也有同样的限制,所以尝试用它们来做这件事很可能(尽管可能有点不确定)本质上是相似的。模板确实给了你给予更多的能力来检查和修改它们的结果,但只是一点点。最终,模板参数需要是编译时常量,以便模板可以在编译时解析。

qvtsj1bj

qvtsj1bj2#

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

8wtpewkr

8wtpewkr3#

这不可能
预处理器在编译源文件之前作为源文件的第一个传递之一运行。
你不能在程序运行时操作预处理器.使用普通变量代替。

gzszwxb4

gzszwxb44#

你不能。预处理器是作为编译之前的一个单独的步骤运行的。没有办法在运行时做到这一点。
你必须使用普通的ifelse处理变量。

相关问题