禁止使用逗号操作符



我从不使用逗号操作符。
但有时,当我写递归时,我会犯一个愚蠢的错误:我忘记了函数名。这就是为什么返回最后一个操作数,而不是递归调用的结果。

简化的例子:

int binpow(int a,int b){
    if(!b)
        return 1;
    if(b&1)
        return a*binpow(a,b-1);
    return (a*a,b/2); // comma operator
}

是否有可能得到一个编译错误,而不是不正确的,难以调试的代码?

可以,但需要注意。gcc有-Wunused-value警告(或-Werror错误)。这将对您的示例生效,因为a*a没有效果。编译器结果:

test.cpp: In function ‘int binpow(int, int)’:
test.cpp:6:43: warning: left operand of comma operator has no effect [-Wunused-value]

然而,这不会捕获单参数调用和所有参数都有副作用的调用(如++)。例如,如果最后一行看起来像

return (a *= a, b/2);

警告不会被触发,因为逗号语句的第一部分具有改变a的效果。虽然这对于编译器来说是可诊断的(赋值一个稍后不使用的本地非易失性变量),并且可能会被优化掉,但是没有gcc警告。

作为参考,手册的完整-Wunused-value条目,突出显示了Mike Seymours的引用:

在语句计算出未显式使用的结果时发出警告。要抑制此警告,将未使用的表达式强制转换为void。这包括没有副作用的表达式语句或逗号表达式的左侧。例如,像x[i,j]这样的表达式会引起警告,而x[(void)i,j]则不会。

gcc允许您指定- unused-value,如果逗号操作符的LHS没有副作用,它将警告您。

相关内容

  • 没有找到相关文章