programing

__attribute__가 선언의 모든 변수에 적용됩니까?

skycolor 2023. 10. 29. 19:08
반응형

__attribute__가 선언의 모든 변수에 적용됩니까?

하십니까?__attribute__지시는 한 줄에 선언된 모든 구성원들에게 적용됩니까?


int a, b, c;

세 개의 int 변수를 선언합니다.


int *a, b, c;

변수 "a"를 int 및 band castin에 대한 포인터로 선언합니다.


int __attribute__((used)) a, b, c;

하십니까?usedattribute를 모든 변수에 적용하거나 모든 변수에만 적용합니다.a?

GCC: 속성-구문:

속성 지정자 목록은 단일 지정자 및 한정자 목록을 사용하여 둘 이상의 식별자 선언에 있는 선언자 목록의 쉼표로 구분된 선언자 목록의 선언자 바로 앞(첫 번째가 아닌)에 표시될 수 있습니다.이러한 속성 지정자는 선언자가 나타나기 전의 식별자에만 적용됩니다.예를 들어, 인

__attribute__((noreturn)) void d0 (void),
     __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
      d2 (void);

noreturnattribute는 선언된 모든 함수에 적용되고 형식 속성은 다음에만 적용됩니다.d1.


수정:댓글에서 지적한 것처럼, 저의 이전 결론은 틀렸습니다.는 첫 부분 에 다른 부분은 눈치채지 못했습니다.

수정된 결론:

둘다

int __attribute__((used)) a, b, c;

그리고.

__attribute__((used)) int a, b, c;

속성은 모든 a, b, c에 적용됩니다.

하지만 만약 그랬다면:

int a, __attribute__((used)) b, c;

속성은 다음에 적용됩니다.b오직.

gcc문서(6.36 Attribute Syntax)에 따르면 이는 선언자가 나타나기 전의 식별자에만 적용된다고 합니다.

속성 지정자 목록은 단일 지정자 및 한정자 목록을 사용하여 둘 이상의 식별자 선언에 있는 선언자 목록의 쉼표로 구분된 선언자 목록의 선언자 바로 앞(첫 번째가 아닌)에 표시될 수 있습니다.이러한 속성 지정자는 선언자가 나타나기 전의 식별자에만 적용됩니다.예를 들어, 인

__attribute__((noreturn)) void d0 (void),
     __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
      d2 (void);

예를 들어보면 다음과 같습니다.

int __attribute__((used)) a, b, c;

속성은 다음에만 적용됩니다.a.

GCC 문서를 참고하여,

키워드를__attribute__선언할 때 특수 속성을 지정할 수 있습니다.이 키워드 뒤에 이중 괄호 안의 속성 규격이 붙습니다.현재 함수에 대해 norereturn, const, format, no_instrument_function, section, constructor, destructor, unused 및 weak의 9개 특성이 정의되어 있습니다.섹션을 포함한 기타 속성은 변수 선언(섹션 4.29 변수의 속성 지정) 및 유형(섹션 4.30 유형의 속성 지정)에 지원됩니다.

섹션 4.29: 변수의 속성

사용되지 않음:
변수에 첨부된 이 속성은 변수가 사용되지 않을 가능성이 있음을 의미합니다.GNU CC는 이 변수에 대한 경고를 생성하지 않습니다.

섹션 4.30: 유형의 속성

사용되지 않음:
조합 또는 구조체를 포함한 유형에 연결된 경우 이 속성은 해당 유형의 변수가 사용되지 않은 것으로 표시됨을 의미합니다.GNU CC는 해당 유형의 변수가 아무 것도 하지 않는 것처럼 보이더라도 경고를 생성하지 않습니다.이것은 대개 정의된 후 참조되지 않지만 사소한 부기 기능을 가진 생성자와 소멸자를 포함하는 잠금 또는 스레드 클래스의 경우에 종종 해당됩니다.

그에 대한 답은 아마도 속성이 아무 것도 하지 않는다는 것입니다.

$ cat f.c
int foo_f1;
int __attribute__((used)) foo_f2;

main()
{
}

그리고.

$ cat g.c
int foo_g1;
int __attribute__((used)) foo_g2;

짓다f obj서로서g장서로서

$ gcc    -c -o g.o g.c
$ ar rs libg.a g.o
$ gcc -O3 f.c -lg

$ objdump.exe -t a.exe  | grep foo
[532](sec  6)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000100 _foo_f1
[599](sec  6)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000104 _foo_f2

기본적으로 링커는 어떤 상징물도 제거하지 않았습니다.f.c그리고 모든 것을 제거했습니다.g.c, 에도 불구하고__attribute__((used)).

언급URL : https://stackoverflow.com/questions/31067318/does-attribute-apply-to-all-the-variables-in-a-declaration

반응형