为什么"未使用的属性"为struct数组生成警告?

时间:2017-11-01 11:14:42

标签: c arrays gcc struct unused-variables

这里使用了unused属性和结构。

根据GCC文件:

  

未使用:

     

此属性附加到变量,表示变量为   意味着可能未被使用。海湾合作委员会不会对此发出警告   变量

但是,在下面的代码中,struct数组生成了警告。

#include <stdio.h>

struct __attribute__ ((unused)) St 
{ 
    int x; 
};

void func1()
{
  struct St s;      // no warning, ok
}

void func2()
{ 
  struct St s[1];   // Why warning???
}

int main() {
    func1();
    func2();
    return 0;
}

为什么GCC会为struct数组生成警告?

2 个答案:

答案 0 :(得分:9)

您没有将属性附加到变量,而是将其附加到类型。在这种情况下,适用不同的规则:

  

当附加到类型(包括unionstruct)时,此[unused]属性意味着该类型的变量可能看起来可能未使用。 GCC不会对该类型的任何变量发出警告,即使该变量似乎什么都不做。

这正是func1内发生的事情:变量struct St s的类型为struct St,因此不会生成警告。

但是,func2不同,因为St s[1]的类型不是struct St,而是struct St的数组。此数组类型没有附加特殊属性,因此会生成警告。

您可以使用typedef

将属性添加到特定大小的数组类型
typedef __attribute__ ((unused)) struct St ArrayOneSt[1];
...
void func2() { 
  ArrayOneSt s;   // No warning
}

Demo.

答案 1 :(得分:3)

此属性应应用于变量 struct定义。 将其更改为

void func2()
{ 
  __attribute__ ((unused)) struct St s[1];  
}

将完成这项工作。