이게 무엇인가요 (())?


90

gcc 컴파일러 소스 코드 (gcc / c-family / c-pragma.c)를 탐색하는 동안 다음을 참조하십시오.

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;

그리고 저에게 많은 C 프로그래밍 (())이 있었음에도 불구하고 ,이 부분 은 아직 완전히 알려지지 않았습니다. 누군가 그 의미를 설명해 주시겠습니까? Google이 찾지 못하는 것 같습니다.


그리고 이것은 GTY무엇입니까? 언어 표준에 정의되어 있지 않습니다. 코드를 참조하십시오.
Alexey Frunze 2013

7
GTY는 매크로입니까 ???
Anshul 2013

1
다음과 같이 쿼리 문자열에 사이트를 지정하여 Google에서 찾을 수 있습니다.GTY site:gcc.gnu.org
ericson

답변:


81

그것들은 GCC 내부 "마법", 즉 컴파일러 구현 자체의 일부입니다.

사용에 대해 설명하는 이 페이지 를 참조하십시오 . 매크로는 가비지 수집 목적으로 유형을 표시하는 데 사용됩니다. 인수도있을 수 있습니다 . 자세한 내용 은 이 페이지 를 참조하세요.

업데이트 : Drew Dorman 이 주석에서 지적했듯이 실제 이중 괄호는 GNU 구현의 "내부 성"의 일부가 아닙니다. 전체 인수 목록을 호출 된 매크로에 대한 단일 인수로 수집하려는 경우 일반적으로 사용됩니다. 이것은 예를 들어 래핑 할 때도 유용 할 수 있습니다 printf(). 이 기술에 대한 자세한 내용은이 질문을 참조하십시오 .


5
@Krishnabhadra 설명은 링크 된 사이트에서 찾을 수 있습니다. GTY 마커 imo와 관련된 GCC 기능에 대한 추가 설명은이 특정 질문 및 답변의 범위를 벗어납니다.
Arne Mertz 2013

30
(())그 자체는 gcc 마술 이 아닙니다 . 쉼표가 포함 된 텍스트를 단일 인수로 매크로에 전달할 수 있습니다. 모든 C / C ++ 컴파일러 용.
Drew Dormann 2013

45

일반적으로 쉼표를 보호하기 위해 매크로와 함께 사용됩니다. 주어진 #define foo(a,b)매크로 호출 foo(1,2,3)은 불법입니다. : 차폐 쉼표 괄호의 관계를 설명의 추가 쌍을 사용하여 foo((1,2),3)대를 foo(1,(2,3)).

이 경우 GTY는 쉼표로 구분 된 여러 인수를 사용할 수 있지만 이러한 모든 쉼표는 보호되어야합니다. 그것이 내면 ()이 모든 논쟁을 둘러싸 는 이유 입니다.


2
왜 누군가가 그러한 전화를 사용해야하는지 설명 할 수 있습니까?
swaechter 2013

5
#define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(C ++에는 물론 매크로보다 더 좋은 솔루션이 있습니다).
MSalters 2013

@Albertus : 템플릿을 매크로에 전달하면 좋을 것 Macro((Pair<int, int>), ...)입니다. 그런 다음 추가 문제가 발생하지만 매크로 내 괄호 제거
BeniBela 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.