Wint-in-bool-context 导致此警告的原因是什么?

问题描述

我在谷歌上搜索过,但我没有找到这个警告的原因Wint-in-bool-context

编译器给了我以下警告:

In file included from /tools/Xilinx/Vivado/2020.1/include/ap_common.h:641,from /tools/Xilinx/Vivado/2020.1/include/ap_int.h:54,from src/matrix_mult.h:35,from src/host.cpp:33:
/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h: In instantiation of 'void ap_private<_AP_W,_AP_S,true>::clearUnusedBits() volatile [with int _AP_W = 32; bool _AP_S = true]':
/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:1485:1:   required from 'ap_private<_AP_W,true>& ap_private<_AP_W,true>::operator=(int) [with int _AP_W = 32; bool _AP_S = true]'
/tools/Xilinx/Vivado/2020.1/include/ap_int.h:160:3:   required from 'ap_int<_AP_W>::ap_int(int) [with int _AP_W = 32]'
src/host.cpp:50:30:   required from here
/tools/Xilinx/Vivado/2020.1/include/etc/ap_private.h:2144:28: warning: enum constant in boolean context [-Wint-in-bool-context]
 2144 |             : (excess_bits ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
      |               ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 2145 |                            : (uint64_t)VAL));

这是与此警告相关的代码行(host.cpp 第 50 行):

#include <ap_int.h>; //This is a library for arbitrary precision integers Xilinx HLS

int M,N

static void initialise(ap_int<32> *A)
{
     for (int i = 0; i < M; i++) {
          for (int j = 0; j < N; j++) {
               A[i * N + j] =  1; // _this is line 50_
          }
     }
}

int main(int argc,char **argv) {
  N = atoi(argv[0]); //user input the matrix sizes during run
  M = atoi(argv[1]);
std::vector<ap_int<32>,aligned_allocator<ap_int<32>> A(N*M);

initialise(A.data());

目标是创建 32 位整数值向量来存储 N*M 大小的矩阵。

解决方法

-Wint-in-bool-context 就像听起来一样。您正在使用整数值并允许它隐式地表现得像 bool(例如,任何非零值都是 true)。

在您的(有限的)代码段中,可能是因为 excess_bits 是一个整数值而不是 bool。要消除此类警告,请改为显式转换,或执行计算结果为布尔表达式的检查——例如:

              : (static_cast<bool>(excess_bits) ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)
//              ^~~~~~~~~~~~~~~~~~~           ~ Tell compiler we want a bool

              : ((excess_bits != 0) ? (((uint64_t)VAL) << (excess_bits)) >> (excess_bits)

您提供的第二个片段不太清楚,因为我们没有错误、确切的违规行或 ap_int<32> 的定义。如果让我猜的话,

的赋值
B.data()[i * n + j] =  0x00000001;

可能应该分配 true 而不是数值;但这只是猜测,因为这里没有给出上下文。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...