将使用"if"的条件放在预处理器C++
Put the condition of using an"if" in preprocessor C++
我在cpp中写了一段代码。我的代码中有一个循环,必须以指定的频率执行。我希望无论何时选择的频率等于或大于70hz,都有一个"if"语句可以工作,无论何时if的内容在没有"if"的情况下执行,但我不知道如何将其作为预处理器写入。我写了这样的东西,但它总是执行其中的"其他"部分:
#define Freq70Hz 70
int frequency = Freq70Hz;
int main
{
while(true)
{
#if frequency == Freq70Hz
if(condition ){
// do the firstthing
}
#else
// do the firstthing
#endif
}
}
这里混合了静态编译时编程和动态运行时编程。在这种情况下,预处理器如何在编译时知道frequency
的值?它可能在程序执行过程中发生变化。你要么想要一个像这样的静态解决方案:
#define FREQUENCY 70 //this can be changed by passing in compiler options
int main()
{
while(true)
{
#if FREQUENCY > 70
if(condition ){
// do the firstthing
}
#else
// do the firstthing
#endif
}
}
或者你想要一个像这样的动态解决方案:
int frequency = 70;
int main()
{
while(true)
{
if(frequency == 70 && condition)
{
// do the firstthing
}
else
{
// do the firstthing
}
}
}
您误解了预处理器的作用。
预处理器在程序运行之前进行文本处理
特别是,它只将正常变量视为文本,不知道它们的类型或值在运行时是什么。即使它们是全局变量,如程序启动时初始化的frequency
,也是如此我们看到了;预处理器没有。
#define Freq70Hz 70
中的别名定义只是文件其余部分的文本替换规则。每当文本("Freq70Hz")出现在程序的其余部分中时,它都会被替换(用"70"代替)——但在编译器看到代码之前。
然后你就成了预处理器规格怪癖的牺牲品。
您认为对#if frequency == Freq70Hz
行进行了有意义的评估。您希望变量frequency
的值将被考虑在内,我们(但不是预处理器!)知道它是70。但事实并非如此。
预处理器看到预处理器标记frequency
。它没有频率是int变量的概念,因为它无法理解C编程语言。它看到这个标记是条件预处理器表达式的一部分。不过,它并没有被告知用一个值来代替它。
现在的问题是:在预处理器条件表达式中执行了所有替换之后,仍然存在的标识符被替换为0(!),参见最新的C草案n1570,6.10.1./4预处理器不会抱怨"未定义的标识符"这使得指令#if frequency == Freq70Hz
成为#if 0 == 70
,这显然总是错误的。
由于默认使用未定义的预处理器标识符是一个危险的特性——普通编程语言在Basic之后就不再这样做了——所以值得知道很久以前有人向我展示的一个技巧:使用宏函数。#define Freq70Hz() 70
在功能上是等效的,但当您以后拼写错误时会抱怨。
使用带有模板的死代码消除
template<bool isGE70Hz>
void DoWhile() {
while(true) {
if (isGE70Hz) { // dead code elimination as isGE70Hz is compiletime constant.
if(condition ){
// do the firstthing
}
} else {
// do the firstthing
}
}
}
int main() {
if (frequency >= Freq70Hz) // chose specialization
DoWhile<true>()
else
DoWhile<false>()
// if frequency and Freq70Hz both are compiletime constants you could do
// DoWhile<frequency >= Freq70Hz>
}
假设// do the firstthing
在两者中都是相同的,并且假设frequency
在执行中不会更改,我不会使用预处理器。。。如果您使用static const int frequency = Freq70Hz
,则稍后执行:
while(true)
{
if(condition || frequency == Freq70Hz){
// do the firstthing
}
}
编译器将根据frequency
不会改变的知识编译出合适的东西。也就是说,如果frequency==Freq70Hz,那么整个if部分将不在可执行版本中。如果频率!=频率70Hz,则if部分将只是条件。
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 当头文件被预处理时是否有一个预处理器选项显示?