Tại sao ép giá trị tham số hàm không sử dụng thành void?


98

Trong một số dự án C, tôi đã thấy mã này:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

Hai phôi để vô hiệu có phục vụ bất kỳ mục đích nào không?


Bỏ phiếu để đóng, vì câu trả lời đúng (ngăn chặn cảnh báo của trình biên dịch về các tham số không sử dụng) nằm trong câu hỏi được liên kết của Charles.
TED

@Cody Grey - Nó đã bị đóng cửa vì lý do đó. Tuy nhiên, thực tế nó không phải là một câu hỏi trùng lặp. 689677 đang nói về việc truyền trả về void chứ không phải tham số.
TED

19
Trên thực tế, cả hai bản sao đều không hợp lệ cho câu hỏi này. Một là C ++, một là liên quan đến các giá trị trả về. Đây không phải là những điều giống nhau . Có bất kỳ bản sao tham số C nào không?
Matt Joiner

2
Đây là một câu hỏi khác với những gì các bản sao đề xuất đã đề cập. Tuy nhiên, tôi có thể hiểu tại sao sai lầm đã được thực hiện. Đã mở lại (rõ ràng).
Tim Post

4
Lưu ý: vui lòng không đóng nó dưới dạng bản sao của một câu hỏi C ++ vì C ++ sử dụng (void)để có hiệu ứng hơi khác. Câu hỏi này là về C
Antti Haapala

Câu trả lời:


89

Nó ở đó để tránh cảnh báo từ trình biên dịch vì một số tham số không được sử dụng.


3
Cách tốt nhất để ngăn chặn các cảnh báo là gì: stackoverflow.com/questions/3417837/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@Benoit tính năng truyền thành void thực sự làm gì? Có phải chức năng duy nhất của nó để hiển thị cho trình biên dịch rằng bạn đang cố tình bỏ qua điều gì đó hoặc làm (void) thực sự làm điều gì đó và khi trình biên dịch nhìn thấy nó, nó sẽ chỉ tính nó là đã làm điều gì đó với biến và do đó không đưa ra cảnh báo?
Tấn Vương

2
@TanWang Chức năng duy nhất của nó là hiển thị trình biên dịch rằng bạn đang cố tình bỏ qua điều gì đó. Nó sẽ không làm bất cứ điều gì trong thời gian chạy.
zwol

14

Lý do các tham số không được sử dụng trong nguyên mẫu thường là vì hàm cần phải tuân theo một số API bên ngoài - có thể đó là một hàm thư viện hoặc một con trỏ đến hàm đó được chuyển cho một hàm khác mong đợi quy ước gọi này. Tuy nhiên, không phải tất cả các đối số được sử dụng bởi quy ước gọi đều thực sự cần thiết trong chính hàm.

Lý do đề cập đến tên tham số trong nội dung là để tránh các cảnh báo như

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

Cảnh báo này có thể được loại bỏ bằng cách sử dụng tham số thực trong thân hàm. Ví dụ: nếu bạn có câu lệnh sau:

ud;

Cảnh báo này hiện đã bị chặn. Tuy nhiên bây giờ GCC sẽ đưa ra một cảnh báo khác :

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

Cảnh báo này cho biết rằng câu lệnh ud;, mặc dù có giá trị cú pháp C, nhưng không ảnh hưởng đến bất kỳ điều gì và có thể là một sai lầm, không khác gì câu lệnh

abort;

mà lẽ ra phải được viết để abort();thay thế cho nó để làm điều gì đó.

Và đó là nơi (void)diễn viên xuất hiện - nó sẽ nói với trình biên dịch một cách rõ ràng và rõ ràng rằng câu lệnh được cho là hoàn toàn không có tác dụng gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.