警告:布尔上下文中的“*”,建议“&&”而不是 [-Wint-in-bool-context]?

warning: '*' in boolean context, suggest '&&' instead [-Wint-in-bool-context]?

提问人:markzzz 提问时间:1/20/2022 更新时间:1/20/2022 访问量:652

问:

我有这段代码(几乎都是“浮点”):

#define sincf(x) (x == 0.0f) ? (1.0f) : (sinf(M_PI * x) / (M_PI * x))
// ...
for (int i = 0; i < num_taps; i++)
    proto[i] = 2.0f * f * sincf(2.0f * f * (i - m / 2.0f));
// ...

为什么 gcc 在布尔上下文中说 warning: '',建议 '&& 而不是 [-Wint-in-bool-context]* 对于第二个 “*”?

  • f 是浮点数
  • proto 是 *float
  • i 和 m 是 int
C++ GCC 警告

评论

2赞 user2864740 1/20/2022
请记住,宏扩展是字面上的。在宏中,使用 instead 可能会“解决”问题。(x)x
1赞 Some programmer dude 1/20/2022
x == 0.0f不太可能是真的,除非你明确使用 .sincf(0.0f)
4赞 Some programmer dude 1/20/2022
在 C++ 中,几乎不需要使用类似函数的宏而不是实际函数。
0赞 U. W. 1/20/2022
在C++中,您应该简单地避免 #define。总有更好的方法可以做你想做的事情......
0赞 Peter 1/20/2022
无法重现。与其强迫人们对你可能遗漏的与你的问题相关的内容做出疯狂的猜测,不如尝试提供一个最小的可重现的例子

答:

6赞 Ted Lyngmo 1/20/2022 #1

替换宏后,这部分

2.0f * f * sincf(2.0f * f * (i - m / 2.0f));

成为

 2.0f * f * (2.0f * f * (i - m / 2.0f) == 0.0f) ? ...

根据运算符优先级,在检查条件是否为 (with ) 之前,将进行乘法运算。这样:2.0f * f * conditiontrue?

(2.0f * f * (2.0f * f * (i - m / 2.0f) == 0.0f)) ? ...

快速修复:

#define sincf(x) (((x) == 0.0f) ? (1.0f) : (sinf(M_PI * (x)) / (M_PI * (x))))

(x) == 0.0f很少会,但由于它仅用于避免除以零,这可能没问题。true

现在,这可以很容易地重写为一个函数,我建议这样做。例:

template<class T>
T sinc(T x) {
    if(x == T{}) return {1}; // avoid division by zero
    auto pix = static_cast<T>(M_PI) * x;
    return std::sin(pix) / pix;
}

也可以强制转换为 if 是整数类型。下面是一个 C++ 版本:xdoubleT

#include <concepts> // std::integral
#include <numbers>  // std::numbers::pi_v

template<class T>
T sinc(T x) {
    if(x == T{}) return 1; // avoid division by zero
    // C++20 added some constants to the standard library:
    auto pix = std::numbers::pi_v<T> * x;
    return std::sin(pix) / pix;
}

double sinc(std::integral auto x) {
    return sinc<double>(x);
}