【问题标题】:Why "unused attribute" generated warning for array of struct?为什么“未使用的属性”会为结构数组生成警告?
【发布时间】:2017-11-01 11:14:41
【问题描述】:

这里使用了unused 带有结构的属性。

根据GCC文档:

未使用:

这个属性,附加到一个变量上,意味着该变量是 意味着可能未使用。 GCC 不会对此产生警告 变量。

但是,在下面的代码中,结构数组产生了警告。

#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 会为结构数组生成警告?

【问题讨论】:

  • 将此属性放在变量中,而不是结构定义中。 __attribute__ ((unused)) struct St s[1];

标签: c arrays gcc struct unused-variables


【解决方案1】:

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

当附加到一个类型(包括union 或struct)时,此[未使用] 属性意味着该类型的变量可能会出现未使用。 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.

【讨论】:

  • 我不建议将数组类型隐藏在typedef 后面。由于阵列衰减,更容易出错。数组变量(也像指针一样)最好显式声明。
【解决方案2】:

此属性应应用于变量不 struct 定义。 改成

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

会做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2015-04-12
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多