如何优雅地避免这种特殊类型的for循环的“条件总是如此”的警告?

问题描述 投票:1回答:3

假设我们有以下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时,我怎样才能优雅地避开这个警告?

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

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

但这不是我所说的优雅。

c for-loop compiler-warnings c89
3个回答
2
投票

如果您不想将其包装在代码中,请使用条件编译包装代码:

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

优雅源于:

  • UPPER为0时没有死代码。
  • 自1970-01-01以来完全可移植到任何C编译器
  • 易于阅读和理解

1
投票

它消除了signedunsigned比较的警告,并阻止编译器优化代码。

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

gcc -Wall -Wextra myfile.c测试编译


0
投票

不是一种好的编码风格,但解决了这个任务。即使优化已关闭,g ++也可以消除死代码。

#define UPPER 0U
int i;
for(i = 0; &((char*)0)[i] < &((char*)0)[UPPER]; i++) {
    /* foo */
}
© www.soinside.com 2019 - 2024. All rights reserved.