MINGW编译错误:无法忽略void值,因为它应该是

时间:2016-04-21 07:57:56

标签: c pointers void-pointers dereference mingw32

在eclipse中构建下面的代码时,我得到的空值不被忽略,因为它应该是,当我们期望函数返回void的值时,会遇到这个错误。但在这里我没有使用任何函数,我使用的是无效指针。 代码如下:

typedef struct MessageName_T 
{
MPM_ParameterName_t  parameterName;
uint32_t minRange;
uint32_t maxRange;
bool_t isInRange;
DataType_t dataType;
bool_t isValueNa;
void* const data;
}MessageName_t ;


MessageName_t messagefr[3] =
/* Parameter,                 Minimum,       Maximum,      isInRange    dataType     isValueNa    data*/
{
  { Parameter,                Minimum,       Maximum,      isInRange,    dataType,     isValueNa,  &stuctureA.data1},
  { Parameter1,               Minimum1,      Maximum1,     isInRange1,   dataType1,   isValueNa1,  &stuctureA.data2},
  { Parameter2,               Minimum2,      Maximum2,     isInRange2,   dataType2,   isValueNa2,  &stuctureA.data3}
}

void rangecheck(int index)
{
   if(messagefr[index].isValueNa == FALSE)
   {
     if(*(messagefr[index].data) >= (messagefr[index].minRange) &&
    *(messagefr[index].data) <= (messagefr[index].maxRange))
 {printf("N");
     messagefr[index].messagefr=TRUE;
 }
 else
 {printf("Y");
     messagefr[index].isInRange =FALSE;
 }
}
else
{
  NOP();
}
}

在行*(messagefr[index].data) >= (messagefr[index].minRange)中,错误&#34; void值不会被忽略,因为它应该是&#34;来了。 data是void指针,我为它赋值&stuctureA.data1。 现在,在访问此数据信息时,*(messagefr[index].data)我收到错误,如果我使用(messagefr[index].data),我会收到分配给数据的地址。

1 个答案:

答案 0 :(得分:3)

在您的代码中,messagefr[index].data的数据类型为void *,您无法取消引用它。

你需要将其转换为其他完整类型才能解除它。

考虑到您正在将值与minRange进行比较,例如

 *(uint32_t *)(messagefr[index].data) 

会奏效。

要添加关于 why 部分的一些细节,首先让我们看看完整和不完整的类型。引用

  

...]对象类型可能是   不完整(缺乏足够的信息来确定该类型对象的大小)或   完成(有足够的信息)。

现在,来到章节§6.5.3.2,一元*运算符,

  

一元*运算符表示间接。如果操作数指向函数,则结果为   功能指示符;如果它指向一个对象,结果是一个左值指定   宾语。如果操作数具有类型为''的类型''指针,则结果的类型为''type''。 [...]

但是,从章节§6.2.5/ 19开始,我们知道

  

void类型包含一组空值;它是一个不完整的对象类型   无法完成。

因此,无法取消引用指向void的指针,因为结果类型(void)不完整,并且无法确定结果对象所需的大小。因此,我们需要在尝试取消引用之前将指针强制转换为完整类型。