假设我们有以下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 */
}
}
但这不是我所说的优雅。
如果您不想将其包装在代码中,请使用条件编译包装代码:
#if UPPER > 0
int i;
for(i = 0; i < UPPER; i++) {
/* foo */
}
#endif
优雅源于:
UPPER
为0时没有死代码。它消除了signed
与unsigned
比较的警告,并阻止编译器优化代码。
#define UPPER 0U
int i;
volatile int u = UPPER;
for(i=0; i < u; i++){
/* foo */
}
用gcc -Wall -Wextra myfile.c
测试编译
不是一种好的编码风格,但解决了这个任务。即使优化已关闭,g ++也可以消除死代码。
#define UPPER 0U
int i;
for(i = 0; &((char*)0)[i] < &((char*)0)[UPPER]; i++) {
/* foo */
}