2013-07-24 34 views
5
static inline __printf(2, 3) 
int dev_err(const struct device *dev, const char *fmt, ...) 
{ return 0; } 

__printf() làm gì và arg thứ ba (...) của dev_err có nghĩa là gì? Tôi có thể hình dung rằng chức năng này là một số chức năng chung. Nó làm gì?Chức năng chung này làm gì?

+0

đối số thứ ba có nghĩa là, hàm này có số biến đối số, va_args; Đối số – Ishmeet

+1

'(...)' là dành cho số lượng đối số biến, [kiểm tra mã này cách hoạt động của nó] (http://stackoverflow.com/questions/15967344/loop-through-char-c/15967653#15967653), chú ý hàm được gọi với số lượng đối số khác nhau như thế nào. –

+1

Bằng cách tìm kiếm '__printf', tôi phát hiện ra rằng đó là #define cho thuộc tính được mô tả tại đây: http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html – chris

Trả lời

11

Mọi thứ có nhiều tiêu chuẩn (xử lý đối số biến) ngoại trừ __printf(2,3).

modifier này đến chức năng (tương tự như static hoặc inline bổ) cho trình biên dịch rằng nó nên kiểm tra chuỗi định dạng tại luận 2 (fmt) so với thông số thực tế bắt đầu từ lập luận 3, sử dụng định dạng printf phong cách specifiers.

Nói cách khác, gọi nó với:

dev_err (pDev, "%d", 1.0); 

sẽ cờ một cảnh báo vì chuỗi định dạng và lập luận thực tế không khớp.

... chỉ đơn giản chỉ ra rằng có một số lượng đối số thay đổi sau chuỗi định dạng, tương tự như cách tự thực hiện printf. C từ lâu đã có khả năng xử lý các danh sách đối số biến đổi, trình sửa đổi __printf() chỉ đơn giản cung cấp cho trình biên dịch một chút thông tin bổ sung để nó có thể xác nhận việc sử dụng hàm của bạn.

Linux định nghĩa __printf(a, b) như __attribute__((format(printf, a, b))) và gcc cho phép mà định dạng thứ hai để xác định thuộc tính varargs kiểm tra theo here (diễn giải dưới đây):


định dạng (nguyên mẫu, chuỗi-index, thứ nhất để kiểm tra):

Thuộc tính định dạng chỉ định rằng một hàm nhận các đối số kiểu printf, scanf, strftime hoặc strfmon cần được kiểm tra kiểu đối với chuỗi định dạng. Ví dụ, việc kê khai:

extern int my_printf (void *my_object, const char *my_format, ...) 
    __attribute__ ((format (printf, 2, 3))); 

làm cho trình biên dịch để kiểm tra các đối số trong các cuộc gọi đến my_printf cho phù hợp với phong cách printf chuỗi định dạng luận my_format. Trong ví dụ trên, chuỗi định dạng (my_format) là đối số thứ hai của hàm my_print và đối số để kiểm tra bắt đầu bằng đối số thứ ba, do đó, các tham số chính xác cho thuộc tính định dạng là 2 và 3.

&hl=vi

Thuộc tính định dạng cho phép bạn xác định các chức năng của riêng bạn lấy chuỗi định dạng làm đối số, để GCC có thể kiểm tra các cuộc gọi đến các hàm này để tìm lỗi.

Như những gì các chức năng tự làm, không có nhiều khác hơn là trở về zero :-)

Nó gần như chắc chắn một placeholder nên bạn đã bao giờ muốn để thực sự thực hiện một dev_err() chức năng thực sự.

0

__printf là một hàm có thể được xác định trong thư viện bạn đang sử dụng với trình biên dịch và ... trong dev_err có nghĩa là phải mất số lượng đối số, va_args;

+2

Bạn đã hiểu sai cách. 'dev_err' là hàm và' __printf' chỉ là một macro. –

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