c - 如何优雅地避免针对这种特定类型的 for 循环的 "condition is always true"警告?

标签 c for-loop compiler-warnings c89

假设我们有以下 for 循环:

#define UPPER 0U
int i;
for(i = 0; i < UPPER; i++) {
    /* foo */
}

这将产生一个 W549: condition is always true警告,显然是因为我们得到了 for(i = 0; i < 0; i++)宏展开后。在实际代码中,UPPER是一个预编译时间参数(即,它由一些构建脚本设置,具体取决于目标平台等),可以取 0 到 255 之间的任何值,因此循环不仅仅是死代码。

UPPER == 0 时,我怎样才能优雅地避免这个警告? ?

显然,可以将 for 循环包装在 if 语句中:

#define UPPER 0U
if(UPPER != 0U) {
    int i;
    for(i = 0; i < UPPER; i++) {
        /* foo */
    }
}

但这不是我所说的优雅。

最佳答案

如果你不想用代码包装它,使用条件编译包装代码:

#if UPPER > 0
  int i;
  for(i = 0; i < UPPER; i++) {
      /* foo */
  }
#endif

优雅源于:

  • UPPER 为 0 时无死码。
  • 自 1970 年 1 月 1 日以来完全可移植到任何 C 编译器
  • 易于阅读和理解

关于c - 如何优雅地避免针对这种特定类型的 for 循环的 "condition is always true"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37271158/

相关文章:

c - 从 C 中的函数返回一个数组

c - gcc 是否自动将静态变量初始化为零?

c - gcc 未能警告未初始化的变量

gcc - 如何禁用有关 #warning 指令是 GCC 扩展的 GCC 警告?

c++ - 当从这个 memcpy 到子类中的新对象时,警告 "destination for this ' memcpy' call is a pointer to dynamic class ...”显示

c - 在 C 中将字符串转换为 long long 时出现问题

c - 打印全局指针给出 coredump

python - 打印所有能被 7 整除并包含 7 从 0 到 100 的数字

mysql - 如何在 NodeJS 中使用 for 循环插入 SQL 表?

c - 将 for 循环放入三元运算中