2017-11-01 5 views
2

ここでは、構造を持つ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が警告を生成するのはなぜですか?

+2

この属性は、構造体定義ではなく変数に置きます。 –

答えて

9

属性に変数を付加するのではなく、変数を型にアタッチしています。この場合には、異なる規則が適用される:(union又はstruct含む)型に取り付けられたとき

を、この[未使用]属性は、その型の変数は、おそらく未使用現れることを意味することを意味します。変数が何もしていないように見えても、GCCはその型の変数について警告を出しません。

これはfunc1内部で起こるまさにです:struct St s変数の型struct Stであるので、警告は生成されません。

St s[1]のタイプstruct Stが、struct Stのアレイはないのでしかし、func2は、異なっています。この配列型には特別な属性は付けられていないため、警告が生成されます。

あなたはtypedefで特定のサイズの配列型に属性を追加することができます

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

Demo.

+0

'typedef'の後ろに配列型を隠すことはお勧めしません。__attribute__((未使用))Sts [1];配列の崩壊のために間違いを起こすのは簡単です。配列変数(ポインタも同様)は明示的に明示的に宣言されます。 – user694733

3

この属性は、変数ないstruct定義に適用されるべきです。

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

に変更します。

関連する問題