2017-02-28 2 views
0

다음 예제에서 clang은 해당 변수를 '.aaa'및 '.ggg'에 올바르게 넣습니다. GCC는 '.ggg'에서는 작동하지만 'aaa '(클래스 템플릿의 정적 멤버 변수)에서는 작동하지 않습니다.은 템플릿 클래스의 정적 멤버에 대한 __attribute __ ((section (". something")))이 허용됩니까?

template<int I> 
struct s{ 
    __attribute__((section(".aaa"))) static int a[100]; 
}; 

__attribute__((section(".ggg"))) int b[100]; 

template<int I> 
__attribute__((section(".aaa"))) int s<I>::a[100]; 

이것은 GCC 버그입니까, clang 측의 자발적인 지원입니까?

s :: a를 정적 멤버가 아닌 전역 멤버로 만드는 것 외에 다른 좋은 방법이 있습니까?

참고 : 나는 기본적으로 godbolt에 GCC의 모든 버전과 컴파일러 버전 않는 같은 일을 남겨 https://godbolt.org/g/E5s0mi

답변

2

GCC의 공식 문서는

를 사용하여 전역 변수와하지와 섹션의 속성을 말한다 지역 변수를 참조하십시오.

로컬 연결이 잘못 되었습니까? 정적 멤버 변수는 클래스 자체가 로컬 인 경우 로컬입니다. 그리고 나는 템플릿 선언을 통해 로컬이라고 말할 것입니다.

source