__attribute__가 선언의 모든 변수에 적용됩니까?
하십니까?__attribute__
지시는 한 줄에 선언된 모든 구성원들에게 적용됩니까?
int a, b, c;
세 개의 int 변수를 선언합니다.
int *a, b, c;
변수 "a"를 int 및 band castin에 대한 포인터로 선언합니다.
int __attribute__((used)) a, b, c;
하십니까?used
attribute를 모든 변수에 적용하거나 모든 변수에만 적용합니다.a
?
속성 지정자 목록은 단일 지정자 및 한정자 목록을 사용하여 둘 이상의 식별자 선언에 있는 선언자 목록의 쉼표로 구분된 선언자 목록의 선언자 바로 앞(첫 번째가 아닌)에 표시될 수 있습니다.이러한 속성 지정자는 선언자가 나타나기 전의 식별자에만 적용됩니다.예를 들어, 인
__attribute__((noreturn)) void d0 (void),
__attribute__((format(printf, 1, 2))) d1 (const char *, ...),
d2 (void);
그
noreturn
attribute는 선언된 모든 함수에 적용되고 형식 속성은 다음에만 적용됩니다.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 유형의 속성 지정)에 지원됩니다.
사용되지 않음:
변수에 첨부된 이 속성은 변수가 사용되지 않을 가능성이 있음을 의미합니다.GNU CC는 이 변수에 대한 경고를 생성하지 않습니다.
사용되지 않음:
조합 또는 구조체를 포함한 유형에 연결된 경우 이 속성은 해당 유형의 변수가 사용되지 않은 것으로 표시됨을 의미합니다.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
'programing' 카테고리의 다른 글
Android Application 클래스를 확장하는 이유는 무엇입니까? (0) | 2023.10.29 |
---|---|
각 ID의 마지막 레코드 가져오기 (0) | 2023.10.29 |
mysql에서 트리거를 작성하려고 할 때 구문 오류 (0) | 2023.10.29 |
튜플 정의에서 후행 쉼표를 사용하는 구문 규칙은 무엇입니까? (0) | 2023.10.29 |
moment.js는 올바른 함수가 제대로 작동하지 않습니다. (0) | 2023.10.29 |