2017-11-01 6 views
2

여기에 구조가있는 unused 속성이 사용됩니다. GCC 문서에 따르면왜 "unused attribute"구조체의 배열에 대한 경고가 생성 되었습니까?

:

미사용 :

이 속성은 변수에 연결된 가변이 가능한 미사용 될 운명 것을 의미한다. 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; 
} 

구조체의 배열에 대해 경고가 생성되는 이유는 무엇입니까?

+2

이 속성을 구조체 정의가 아닌 변수에 넣습니다. –

답변

9

변수에 속성을 연결하지 않고 유형에 연결합니다. 이 경우, 다른 규칙이 적용

(a 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__ ((unused) struct St s [1]; 어레이 붕괴로 인해 실수를하는 것이 더 쉽습니다. 포인터와 같은 배열 변수도 명시 적으로 더 잘 선언됩니다. – user694733

3

이 속성은 변수 하지struct 정의에 적용되어야한다.

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

으로 변경하십시오.