2010-11-10 24 views
7

Tôi nhớ đọc trước về ý nghĩa (hoặc thiếu nó) giữa bao gồm tên tham số trong khai báo hàm và không bao gồm một tên. Nhưng tôi không thể nhớ những gì tôi đã đọc hoặc nơi tôi đọc nó.sự khác biệt giữa việc bao gồm tên thông số trong khai báo hàm và không bao gồm một thông số là gì?

ví dụ,

void do_something(int *); // No parameter name included, only type. 

vs ...

void do_something(int * i); // type AND parameter name included. 

Vì vậy, sự khác biệt giữa hai tờ khai này là gì? Cảm ơn bạn đã đọc và có thể trả lời câu hỏi này có thể tầm thường.

- CẬP NHẬT -

Được rồi, do đó, điều tôi đã đọc được một tập hợp các hướng dẫn phong cách từ một giáo sư cũ của tôi cảnh báo chống lại bao gồm một tên tham số trong định nghĩa hàm và KHÔNG sử dụng tham số trong hàm .

void do_something(int * i) { //code that doesn't use i;} //BAD 
void do_something(int *) { //code that doesn't use i;} //OK 

Trả lời

12

Không có sự khác biệt, theo như trình biên dịch liên quan.

Thêm tên tham số có ý nghĩa là một dạng tài liệu hữu ích.

1

Sự khác biệt là phiên bản thứ hai có thể dễ đọc hơn nếu bạn chọn tên thông số tốt. Không có gì để nói nữa ;-)

0

Trong bản khai báo chuyển tiếp, sẽ không có sự khác biệt. Cả hai đều sẽ mô tả cùng một bố trí bộ nhớ cho cuộc gọi, vì vậy họ nên hoàn toàn hoán đổi cho nhau.

1

Không có sự khác biệt về mặt kỹ thuật giữa các khai báo đó. Thay vào đó, nếu bạn đã có

void accumulate_stats(int * count); 

hoặc mô tả tương tự, đó sẽ là cải thiện trong tự tài liệu.

0

Để khai báo chuyển tiếp, nó không tạo ra bất kỳ sự khác biệt nào.

Trong định nghĩa thực tế, thông số không có tên không được chọn để sử dụng. Đó là một cách để có các tham số không sử dụng mà không có một số macro UNUSED_PARAM (x) hoặc một số thủ thuật khác mà mục đích duy nhất của nó là đóng trình biên dịch về nó.

+0

Macro là loại tà ác, những gì có xung đột tên, nhiều đánh giá của arg, v.v. Đôi khi chúng thực sự cần thiết, nhưng tốt hơn hết là tránh chúng nói chung. Vì vậy, tốt hơn sử dụng mẫu chức năng 'unusedParam'. Đó là, nếu bạn không thể sống với các cảnh báo. Chúc mừng, –

+0

Đồng ý, macro là điều ác. Nhưng IMO, bất kỳ mã nào tồn tại chỉ để nói "yeah, tôi không làm bất cứ điều gì với lập luận này. Shut up, bạn trình biên dịch ngu ngốc!" không tốt hơn nhiều. – cHao

+0

Đó là lý do tại sao cú pháp '(void) argName;' tồn tại. Điều đó nói với trình biên dịch rằng 'argName' được" sử dụng ", mặc dù nó đánh giá thành một no-op. –

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