dài ish truyện ngắn:
Đây là một vĩ mô mở rộng thành bộ gcc thuộc tính. Chúng là một cách để cung cấp trình biên dịch với thông tin đặc biệt về nhiều thứ khác nhau trong mã của bạn, như trong trường hợp này là một hàm.
Trình biên dịch khác nhau có cú pháp khác nhau cho mục đích này, nó không phải là standartized. Ví dụ, gcc sử dụng các thuộc tính, nhưng các trình biên dịch khác sử dụng các cấu trúc khác nhau.
câu chuyện dài ish dài ish:
Vì vậy, tôi không có chuyên môn Linux kernel, nhưng căn cứ vào mã nguồn, macro này được sử dụng cho Hotplug. Tôi tin rằng nó biểu thị rằng chức năng nên làm điều gì đó với một thiết bị cụ thể thoát.
Ví dụ: chức năng bạn cung cấp có vẻ là từ tập hợp các chức năng Hotplug để làm việc với trình điều khiển trình đọc thẻ Realtek PCI-Express.
Macro đó thực sự làm gì? Vâng, chúng ta hãy xem xét kỹ hơn định nghĩa của vĩ mô:
#define __devexit __section(.devexit.text) __exitused __cold
Phần đầu tiên là __section(.devexit.text)
:
# define __section(S) __attribute__ ((__section__(#S)))
Như bạn có thể thấy, điều này tạo ra một __attribute__(__section__())
với tên phần là ".devexit.text"
. Điều này có nghĩa là gcc sẽ biên dịch mã assembly của một hàm với thuộc tính này thành một phần có tên trong tệp nhị phân đã biên dịch với tên .devexit.text
(thay vì phần mặc định).
Phần thứ hai là __exitused
(được định nghĩa một cái gì đó chỉ khi vĩ mô MODULE
được định nghĩa):
#define __exitused __used
Và __used
là, tùy theo phiên bản gcc, được xác định một trong hai như thế này:
# define __used __attribute__((__used__))
hoặc như thế này:
# define __used __attribute__((__unused__))
Trước đây đảm bảo chức năng có thuộc tính này được biên dịch ngay cả khi nó không được tham chiếu ở bất kỳ đâu. Sau này ngăn chặn các cảnh báo trình biên dịch trong cùng một trường hợp, mặc dù nó không ảnh hưởng đến việc biên dịch theo bất kỳ cách nào.
Và, cuối cùng, __cold
:
#define __cold __attribute__((__cold__))
Đây là một thuộc tính mà thông báo cho trình biên dịch rằng chức năng với thuộc tính này sẽ không được gọi là thường, vì vậy nó có thể tối ưu hóa cho phù hợp.
Sooo, chúng ta có gì cuối cùng? Có vẻ như các hàm được đánh dấu bằng __devexit
là chỉ các hàm không được gọi thường là (nếu được gọi là tất cả) và được nhồi vào phần được đặt tên.
Tất cả mã nguồn được lấy từ here. Dường như macro hiện đã là removed from the Linux Kernel.
Đây là lần thử hai câu hỏi này. Có vẻ như nỗ lực đầu tiên đã quá mờ ám với những chi tiết không liên quan đến việc nó không được trả lời. Tôi muốn xóa câu hỏi, nhưng ngăn xếp ngăn chặn cảnh báo rằng nó đã bị cau mày, và tôi cảm thấy rằng một bản chỉnh sửa sẽ làm cho các câu trả lời trước trông có vẻ không liên quan. Nếu bất cứ ai đề nghị chọn một chỉnh sửa/xóa thay vào đó, hãy cho tôi biết. – Kenkron
Tại sao bạn không nhấp chuột phải vào biểu tượng '__devexit', đi đến định nghĩa của nó và tự mình xem chính xác ý nghĩa của nó ??? Nó rất có thể chỉ là một chú thích được sử dụng để tạo ra các cảnh báo được xác định trước bởi một công cụ bên ngoài để kiểm tra tính chính xác của mã hóa hoặc một cái gì đó tương tự. –
Đây là một số macro trong hạt nhân Unix: http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/init.h – SomethingSomething