2011-09-08 21 views
36

documentation for GCC's __attribute__((...)) syntax chỉ ra rằng các thuộc tính phải được bao quanh bởi dấu ngoặc kép, nhưng không đưa ra lý do cho quyết định thiết kế này.Tại sao cú pháp __attribute __ ((...)) của GCC sử dụng dấu ngoặc kép?

Lý do thực tế nào khiến các nhà thiết kế của GCC yêu cầu điều này? Liệu nó có liên quan đến việc xử lý các cặp dấu ngoặc kép của bộ xử lý trước không?

Trả lời

37

Để dễ dàng loại bỏ nó cho trình biên dịch khác nhau. Nếu bạn có mã di động, bạn cần phải loại bỏ chúng cho các trình biên dịch khác, vì vậy bạn làm

#ifndef __GNUC__ 
#define __attribute__(x) 
#endif 

Vấn đề là các thuộc tính có số khác nhau của các đối số và bạn có thể kết hợp nhiều thuộc tính trong một __attribute__ khai, nhưng C chỉ giới thiệu Macro biến thể trong C99. Với dấu ngoặc kép, định nghĩa trên không cần macro Variad.

15

có lẽ ý tưởng là bạn có thể khai báo một macro đơn giản giúp bỏ qua tất cả điều này trong bất kỳ trình biên dịch C và C++ nào khác. Nếu bạn không có cặp dấu ngoặc đơn thứ hai, macro sẽ nhất thiết phải là một với .... Vì vậy, đối với các trình biên dịch không hỗ trợ bạn sẽ bị vặn.

Edit: Với cú pháp này nó chỉ đơn giản có thể trông giống như

#ifdef __GNUC__ 
# define attribute(X) __attribute__(X) 
#else 
# define attribute(X) 
#endif 

và sau đó bạn sẽ sử dụng attribute cho tờ khai chức năng của bạn, ví dụ

+2

Hành vi không xác định của nó để xác định tên macro bắt đầu bằng dấu gạch dưới kép. – dreamlax

+0

@dreamlax, tôi biết. Tôi đã không nói rằng người ta nên làm điều này, nhưng những gì tôi nghĩ là ý tưởng đằng sau nó. –

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