c - if 语句中的编译时条件
问题描述
如果我有一个if
可以在编译时评估的条件语句,if
如果条件评估为 false,编译器会删除整个语句,如下所示:
if (1 < 0) { puts("hello"); }
if
或者如果条件评估为真,则删除检查:
if (0 < 1) { puts("hello"); }
/* just becomes */
puts("hello");
解决方案
几乎我见过的每个编译器都会评估其操作数是整数常量表达式的算术和比较运算符,以产生整数常量表达式,并将基于常量零或常量非零条件优化条件分支。在许多编译器上,这可用于通过以下结构来促进编译时断言:
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
将被优化,因此链接器将没有理由关心是否该功能存在。但是,我使用的其他一些编译器将包含对该函数的引用,无论它是否被调用,如果它不存在,则会导致链接错误。
推荐阅读
- go - Golang中多个程序之间的交互
- java - 测试单个包会跳过 TestNG 中的参数化测试
- git - 如何离开由“git pull --rebase”创建的时间分支?
- pdf - 自定义媒体类型的 URI?
- php - PHP 属性不存在但使用时不会抛出错误
- android - BottomNavigationView 上的选项卡
- c# - 给定位置 C# Unity 的力,计算 GameObject 的旋转速度
- javascript - 将传递给 new Date() 的日期与 new Date() 返回的日期进行比较;
- java - 必须在调用 save() 之前手动分配此类的 id;
- python - 玩家的 Rect 未与玩家/角色对齐