2011-12-21 35 views
36

tôi tìm thấy mã này trong các tiêu đề linux, /usr/include/dirent.h:Mục đích của #define này trong một enum là gì?

enum 
    {  
    DT_UNKNOWN = 0, 
# define DT_UNKNOWN DT_UNKNOWN 
    DT_FIFO = 1, 
# define DT_FIFO DT_FIFO 
    DT_CHR = 2, 
# define DT_CHR  DT_CHR 
    DT_DIR = 4, 
# define DT_DIR  DT_DIR 
    DT_BLK = 6, 
# define DT_BLK  DT_BLK 
    DT_REG = 8, 
# define DT_REG  DT_REG 
    DT_LNK = 10, 
# define DT_LNK  DT_LNK 
    DT_SOCK = 12, 
# define DT_SOCK DT_SOCK 
    DT_WHT = 14 
# define DT_WHT  DT_WHT 
    }; 

gì được này xây dựng cho? - tại sao xác định một cái gì đó với một chuỗi giống nhau, sau đó sẽ biên dịch thành giá trị int?

+0

Có thể chỉ có định nghĩa và ai đó đã thêm enum sau đó. – Chris

Trả lời

21

Tôi đoán là một số mã khác có thể kiểm tra xem một trong số (hoặc nhiều) giá trị enum này đã được xác định bằng #ifdef chưa.

+3

Tốt nhất của cả hai thế giới - kiểm tra định nghĩa bằng '# ifdef', nhưng vẫn hiển thị dưới dạng tên tượng trưng trong gỡ lỗi. –

+0

Có, đây có thể là trường hợp. Và như Chris đã nói trong phần bình luận cho câu hỏi, có lẽ đó là di sản - enum được thêm vào sau, nhưng khả năng #ifdef trên chúng vẫn cần thiết. – GrahamW

+5

+1: mẹo này được mô tả trong tài liệu 'cpp' của' gcc'] (http://gcc.gnu.org/onlinedocs/gcc-4.6.2/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros) như là việc sử dụng hữu ích các macro tự tham chiếu. –

11

Đoán của tôi (không được giáo dục) là các câu lệnh #define cho phép kiểm tra có điều kiện để xem liệu hằng số đã được xác định chưa.

Ví dụ:

#ifdef DT_UNKNOWN 
    // do something 
#endif 
24

Bên cạnh những câu trả lời khác mà là rất tốt - Tôi sẽ đi với họ vì lý do chính - trình biên dịch có thể tạo ra cảnh báo hoặc lỗi nếu bạn cố gắng để xác định lại DT_UNKNOWN.

0

Tôi đã sử dụng các đối số -E-dD (và cũng -fdump-tree-all) trong gcc để xem đầu ra tiền xử lý và không thấy gì hữu ích. Vì vậy, tôi đoán mã này không có bất kỳ chức năng nào khác ngoài việc có thể hiển thị tên biểu tượng khi gỡ lỗi bằng cách sử dụng trình gỡ lỗi như gdb.

7

Tôi nghĩ câu trả lời của Luchian Grigore là chính xác.

Mã mà không cần định nghĩa:

#include <stdio.h> 

// Defined somewhere in headers 
#define DT_UNKNOWN 0 

enum 
{ 
    DT_UNKNOWN = 0, 
    DT_FIFO = 1, 
}; 

int main(int argc, char **argv) 
{ 
    printf("DT_UNKNOWN is %d\n", DT_UNKNOWN); 
    return 0; 
} 

Từ đầu ra của trình biên dịch không rõ lý do tại sao một số dòng mã bên trong enum không muốn xây dựng:

[email protected]:~/tmp$ gcc -Wall ./main.c 
./main.c:7: error: expected identifier before numeric constant 

Sau khi chúng tôi thêm định nghĩa ví dụ:

#include <stdio.h> 

// Defined somewhere in headers 
#define DT_UNKNOWN 0 

enum 
{ 
    DT_UNKNOWN = 0, 
    # define DT_UNKNOWN DT_UNKNOWN 
    DT_FIFO = 1, 
    # define DT_FIFO DT_FIFO 
}; 

int main(int argc, char **argv) 
{ 
    printf("DT_UNKNOWN is %d\n", DT_UNKNOWN); 
    return 0; 
} 

Trình biên dịch sẽ cho chúng tôi biết rằng DT_UNKNOWN được định nghĩa lại và địa điểm được định nghĩa lại:

[email protected]:~/tmp$ gcc -Wall ./main2.c 
./main2.c:7: error: expected identifier before numeric constant 
./main2.c:8:1: warning: "DT_UNKNOWN" redefined 
./main2.c:3:1: warning: this is the location of the previous definition 
Các vấn đề liên quan