Cái này là cái gì (( ))?


90

Trong khi duyệt qua mã nguồn trình biên dịch gcc (gcc / c-family / c-pragma.c), tôi thấy:

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

và bất kể tôi có rất nhiều năm lập trình C đi sau, những bit này: (())tôi hoàn toàn chưa biết. Ai đó có thể vui lòng giải thích ý nghĩa của họ không? Google dường như không tìm thấy nó.


Và đây là GTYgì? Nó không được định nghĩa trong tiêu chuẩn ngôn ngữ. Xem mã của bạn.
Alexey Frunze

7
GTY có phải là macro không ???
Anshul

1
Bạn có thể tìm thấy nó trên Google bằng cách chỉ định trang web trong chuỗi truy vấn như sau:GTY site:gcc.gnu.org
ericson

Câu trả lời:


81

Chúng là "ma thuật" bên trong GCC, tức là một phần của chính việc thực thi trình biên dịch.

Xem trang này nói về việc sử dụng chúng. Macro được sử dụng để đánh dấu các loại cho mục đích thu gom rác. Cũng có thể có các đối số, hãy xem trang này để biết chi tiết.

CẬP NHẬT :: Như đã chỉ ra bởi Drew Dorman trong một nhận xét, dấu ngoặc kép thực tế không phải là một phần của "nội bộ" của việc triển khai GNU; chúng thường được sử dụng khi bạn muốn thu thập toàn bộ danh sách các đối số vào một đối số duy nhất cho macro được gọi. Điều này đôi khi có thể hữu ích khi gói ví dụ printf(). Xem câu hỏi này, để biết thêm về kỹ thuật này .


5
@Krishnabhadra giải thích có thể được tìm thấy trên trang web được liên kết. Giải thích thêm về các tính năng GCC liên quan đến imo GTY-marker sẽ nằm ngoài phạm vi của câu hỏi và câu trả lời cụ thể này.
Arne Mertz

30
(())bản thân nó không phải là phép thuật gcc. Nó cho phép một văn bản bao gồm dấu phẩy được chuyển tới macro dưới dạng một đối số duy nhất. Đối với bất kỳ trình biên dịch C / C ++ nào.
Drew Dormann

45

Nói chung, nó được sử dụng với macro để che dấu phẩy. Cho trước #define foo(a,b), lời gọi macro foo(1,2,3)sẽ là bất hợp pháp. Sử dụng thêm một cặp dấu ngoặc đơn sẽ làm rõ dấu phẩy nào được che chắn: foo((1,2),3)so với foo(1,(2,3)).

Trong trường hợp này, hàm GTYcó thể nhận nhiều đối số, được phân tách bằng dấu phẩy, nhưng tất cả các dấu phẩy này phải được che chắn. Đó là lý do tại sao bên trong ()bao quanh tất cả các đối số.


2
Bạn có thể giải thích tại sao ai đó nên sử dụng cách gọi như vậy không?
swaechter

5
Ví dụ: #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(Tất nhiên, trong C ++ có các giải pháp đẹp hơn macro).
MSalters

@Albertus: cũng sẽ rất hay, nếu bạn chuyển các mẫu sang macro Macro((Pair<int, int>), ...). Mặc dù sau đó bạn chạy vào rắc rối thêm, loại bỏ các dấu ngoặc trong vĩ mô
BeniBela
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.