首页 > 解决方案 > if 语句中的编译时条件

问题描述

如果我有一个if可以在编译时评估的条件语句,if如果条件评估为 false,编译器会删除整个语句,如下所示:

if (1 < 0) { puts("hello"); } 

if或者如果条件评估为真,则删除检查:

if (0 < 1) { puts("hello"); }

/* just becomes */ 
puts("hello"); 

标签: cif-statement

解决方案


几乎我见过的每个编译器都会评估其操作数是整数常量表达式的算术和比较运算符,以产生整数常量表达式,并将基于常量零或常量非零条件优化条件分支。在许多编译器上,这可用于通过以下结构来促进编译时断言:

if (WOOZLE >= 23)
{
  extern void woozle_isnt_a_constant_less_than_23(void);
  woozle_isnt_a_constant_less_than_23();
}

在该构造可用作静态断言的编译器上,如果 WOOZLE 是小于 23 的编译时整数常量,则函数调用和对标识符的所有引用都woozle_isnt_a_constant_less_than_23将被优化,因此链接器将没有理由关心是否该功能存在。但是,我使用的其他一些编译器将包含对该函数的引用,无论它是否被调用,如果它不存在,则会导致链接错误。


推荐阅读