2

Here used, unused attribute with structure.

According to GCC document:

unused :

This attribute, attached to a variable, means that the variable is meant to be possibly unused. GCC will not produce a warning for this variable.

But, In the following code, array of struct generated warning.

#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;
}

Why does GCC generated warning for array of struct?

Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
msc
  • 33,420
  • 29
  • 119
  • 214
  • 2
    Put this attribute to the variable, not to the struct definition. `__attribute__ ((unused)) struct St s[1];` – Alex Lop. Nov 01 '17 at 11:19

2 Answers2

9

You are not attaching the attribute to a variable, you are attaching it to a type. In this case, different rules apply:

When attached to a type (including a union or a struct), this [unused] attribute means that variables of that type are meant to appear possibly unused. GCC will not produce a warning for any variables of that type, even if the variable appears to do nothing.

This is exactly what happens inside func1: variable struct St s is of type struct St, so the warning is not generated.

However, func2 is different, because the type of St s[1] is not struct St, but an array of struct St. This array type has no special attributes attached to it, hence the warning is generated.

You can add an attribute to an array type of a specific size with typedef:

typedef __attribute__ ((unused)) struct St ArrayOneSt[1];
...
void func2() { 
  ArrayOneSt s;   // No warning
}

Demo.

Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
  • I do not recommend hiding array types behind `typedef`. It's easier to make mistakes due to array decay. Array variables (like pointers too) are better declared explicitly. – user694733 Nov 01 '17 at 12:02
3

This attribute should be applied on a variable not struct definition. Changing it to

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

will do the job.

Alex Lop.
  • 6,810
  • 1
  • 26
  • 45