2011-07-26 23 views
5

Tôi đã phát hiện ra một số thứ trong các tệp tiêu đề C những gì tôi không thể tìm ra điều gì là dành cho. Ví dụ trong tập tin bits/socket.h có một kiểu liệt kê enum __socket_type, nhưng sau mỗi điều tra có một macro xác định xác định giống nhau. Ví dụ:Xác định lại các điều tra enum bằng #define

enum __socket_type 
{ 
    SOCK_STREAM = 1, 
    #define SOCK_STREAM SOCK_STREAM 
    ... 
}; 

Tôi không thể tìm hiểu điều này là gì. Vui lòng làm sáng tỏ cho tôi. Tôi thậm chí không biết làm thế nào để hình thành câu hỏi đúng cho truy vấn google cũng không tìm kiếm trang web này hộp.

Trả lời

4

Macro tiền xử lý trước sẽ không bao giờ mở rộng đệ quy, do đó, những gì như vậy #define sẽ để lại tên ở vị trí bất kỳ được sử dụng. Những thứ như vậy rất hữu ích khi bạn muốn thử nghiệm tính năng tiền xử lý.

#ifdef SOCK_STREAM 
.. 
#endif 

có thể được sử dụng để biên dịch một số điều kiện sau đó.

Chỉnh sửa: Vì vậy, điều này kết hợp cách tiếp cận sạch hơn của liệt kê (giá trị ngầm định không có xung đột và phạm vi) với các thử nghiệm tiền xử lý.

+0

thực sự, điều này có ý nghĩa, nhưng tại sao cũng có enums không chỉ xác định? – BeginEnd

+0

@BeginEnd, vui lòng xem chỉnh sửa của tôi –

+0

Tôi sợ rằng bạn sẽ nói điều này. : P Thực hiện những điều "phổ quát" như thế thường khiến cuộc sống lập trình của tôi khó khăn hơn ... – BeginEnd

5

Điều duy nhất tôi có thể nghĩ đến là bởi vì mọi người nhìn thấy một hằng số trong tất cả các mũ, nói NUM_FILES, họ sẽ nghĩ rằng đó là một vĩ mô và đang bị cám dỗ để viết những dòng này:

#ifdef NUM_FILES 

Bây giờ bình thường này sẽ thất bại, nhưng nếu bạn viết #define NUM_FILES NUM_FILES nó hoạt động như một macro cho tiền xử lý và IDE và như là một enum cho chính mã đó.

0

Tôi cho rằng đó là dành cho IDE hoặc các công cụ khác để hiểu rằng biểu tượng được xác định theo một cách nào đó.

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