2012-11-05 32 views
6
#define ext4_debug(f, a...)      \ 
    do {        \ 
     printk(KERN_DEBUG "EXT4-fs DEBUG (%s, %d): %s:", \ 
      __FILE__, __LINE__, __func__);   \ 
     printk(KERN_DEBUG f, ## a);    \ 
    } while (0) 

những gì tôi không hiểu là thế này"##" trong printk, những gì hiện ## nghĩa

printk(KERN_DEBUG f, ## a); 

Ai có thể giúp tôi hiểu những gì là ## trong dòng này? cảm ơn bạn

+0

@Insilico đó là người không đúng, câu hỏi được đặt ra là khác nhau. Nó liên quan đến chỉ thị tiền xử lý '##' cho các macro variadic, và chú ý rằng bạn chỉ có '## a', chứ không phải' g ## a'. –

+0

Aniket là đúng, đây không phải là một bản sao, bởi vì '##' có nghĩa là một cái gì đó khác biệt trong ngữ cảnh này hơn là trong bối cảnh được đưa ra trong câu hỏi đó. Mọi người bỏ phiếu để đóng một bản sao: vui lòng đọc kỹ hơn trước khi làm như vậy. –

Trả lời

2

Nó ở đó để làm cho macro variadic (macro có thể lấy nhiều đối số) hoạt động nếu bạn vượt qua trong 0 đối số.

Từ Variadic Macros section trong cuốn hướng dẫn GCC:

Thứ hai, ## nhà điều hành dán thẻ có một ý nghĩa đặc biệt khi được đặt giữa một dấu phẩy và một cuộc tranh luận khác nhau. Nếu bạn viết

#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__) 

và đối số biến được bỏ qua khi vĩ mô eprintf được sử dụng, sau đó dấu phẩy trước khi ## sẽ bị xóa. Điều này không xảy ra nếu bạn vượt qua một đối số trống, cũng không xảy ra nếu mã thông báo trướC## là bất kỳ điều gì khác ngoài dấu phẩy.

eprintf ("success!\n") 
    ==> fprintf(stderr, "success!\n"); 

Nếu bạn không sử dụng này, sau đó sẽ mở rộng tới frpintf(stderr, "success!\n",), mà là một lỗi cú pháp.

+1

chính xác tôi đã nói với mọi người rằng nó không phải là mã thông báo –

+0

xin vui lòng bỏ phiếu bầu mở lại, câu hỏi này không phải là một bản sao, và đã bị đóng bởi một số người vô tình. Câu hỏi này là khác biệt và nguyên bản –

+0

@Aniket Tôi đã bỏ phiếu bầu lại; Tôi nghi ngờ bạn và tôi đã làm như vậy. Cảm ơn vì đã sửa chữa mọi người ở đây; nó là bực bội khi mọi người nhảy vào câu trả lời sai hoặc quyết định bỏ phiếu sai quá nhanh. –

3

Mã thông báo cho các macro Vĩ độ (macro có nhiều đối số biến). Chỉ thị cụ thể gcc của nó cho phép 0 hoặc nhiều đối số làm đầu vào, sau f trong ext4_debug(). Có nghĩa là, đối số f là bắt buộc, a có thể hoặc không tồn tại.

Điều này giống như printf(const char *fmt,...) ở đâu, fmt là bắt buộc, các đối số khác là tùy chọn và phụ thuộc vào fmt. Xem tuyên bố cuối cùng trong tài liệu này: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

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