2013-02-15 29 views
90

Trong khi duyệt qua các mã nguồn gcc biên dịch (gcc/c gia đình/c-pragma.c) Tôi thấy:Đây là gì (())?

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

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

+0

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

+7

là GTY một macro ??? – 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

Trả lời

81

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

Xem this page nói về cách sử dụng của chúng. Macro được sử dụng để đánh dấu các loại cho mục đích thu gom rác thải. Cũng có thể có đối số, xem this page để biết chi tiết.

CẬP NHẬT :: Như được chỉ ra bởi Drew Dorman trong 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 đối số thành một đối số duy nhất cho macro được gọi. Điều này đôi khi hữu ích khi gói ví dụ: printf() cũng vậy. See this question, for more on this technique.

+11

hy vọng thêm chút giải thích sau .. – Krishnabhadra

+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 của GCC liên quan đến IMI của GTY sẽ vượt quá phạm vi của câu hỏi và câu trả lời cụ thể này. –

+29

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

45

Nói chung, nó được sử dụng với các macro để che chắn dấu phẩy. Với #define foo(a,b), lệnh gọi macro foo(1,2,3) sẽ là bất hợp pháp. Sử dụng một cặp dấu ngoặc đơn bổ sung 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, GTY có thể thực hiện nhiều đối số, cách nhau 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 các 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 một cuộc gọi như vậy? – swaechter

+5

Ví dụ: '#define PRINT_A_LOT (a, b) printf (" tiền tố \ n "); printf a; printf ("infix \ n"); printf b; printf ("suffix \ n"); '(Trong C++ có các giải pháp đẹp hơn macro, dĩ nhiên). – MSalters

+0

@Albertus: cũng sẽ rất hay, nếu bạn chuyển mẫu tới macro macro Macro ((Pair ), ...) '. Mặc dù sau đó bạn chạy trong rắc rối bổ sung, thoát khỏi dấu ngoặc đơn trong macro – BeniBela

Các vấn đề liên quan