如何在运行时取消定义和定义预处理器值
How can I undef and def preprocessor value at run time
我有下面的代码。我想在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
处理来做到这一点。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- 如何摆脱为条件编译定义预处理器宏的需要?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 导致编译错误的自定义预编译标头
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 在宏中定义然后取消定义预处理器变量
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Visual Studio 2015-用GIT分支和GIT提交定义预处理变量
- 预处理之后和使用CMake编译之前的自定义构建步骤
- 预处理一个自定义文本文件,以使用Boost Spirit删除注释
- 如何使用自定义预处理与Eigen
- 具有已定义宏的 iOS 预处理条件会导致"token is not valid"
- 在 VC++ 2010 中使用 MSBuild 对文件执行自定义预处理