2017-09-20 37 views
6

Nó có thể không rõ ràng từ tiêu đề. Tôi đi qua đoạn mã sau trong một dự án STM32 nhúng. Tôi không hiểu dòng bên trong hàm.Câu này có ý nghĩa gì trong C: "(void) ptr;"

static void txend1(UARTDriver *uartp) { 
     (void)uartp; // what does this do? Is it a statement? 
    } 

Tôi đã thử tìm kiếm ở nơi khác trực tuyến, nhưng hầu hết kết quả là truyền con trỏ để làm mất con trỏ mà tôi không nghĩ đây là. Cảm ơn đã giúp đỡ!

+3

Nó có nghĩa là "không cho tôi biết tôi đang viết mã xấu, tôi muốn truyền tải * * không sử dụng tranh luận". C trình biên dịch là một chút hậu môn về nó và có xu hướng tạo ra một cảnh báo. Thường là thích hợp, nhưng không phải ở đây. Anh không muốn làm bất cứ điều gì đặc biệt khi kết thúc cuộc trao đổi, không phải bất thường. Con trỏ hàm không phải là lựa chọn của anh ta. –

+0

@HansPassant Điều này cũng có thể là do API được thực thi từ bên ngoài và/hoặc vì mục đích thống nhất - ví dụ, có thể có một triển khai thay thế sử dụng con trỏ. – SomeWittyUsername

+0

Yup, đó là những gì "con trỏ hàm không phải là lựa chọn của anh ấy" có nghĩa là. –

Trả lời

12

đây chỉ là một portable way to suppress the warning trên thông số này không được sử dụng uart.

Nó không có tác dụng, nhưng trình biên dịch thấy rằng khi được sử dụng và không đưa ra bất kỳ cảnh báo nào.

Rất hữu ích khi nguyên mẫu của hàm được áp dụng/không thể thay đổi (hàm gọi lại) nhưng triển khai của bạn không cần tham số này.

(lưu ý rằng gcc ủng hộ __attribute__((unused)) xây dựng, dễ hiểu, nhưng không tương thích với tất cả các trình biên dịch)

+0

Hm ... er..why không nói cho trình biên dịch không cảnh báo thay vì mã hóa vô nghĩa? – savram

+2

vì bạn muốn cảnh báo cho những địa điểm bạn không biết điều này là cách bạn ngăn chặn những địa điểm này. Một số trình biên dịch có một pragma hoặc chỉ thị, nhưng gcc và những người khác sẽ cho phép bạn chỉ cần làm x = x; hoặc có lẽ như trong trường hợp này x; –

+2

@savram Bạn có thể muốn được cảnh báo về các biến không sử dụng khác. – Gam

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