2012-03-03 98 views
11

Trong C++ sử dụng void trong một hàm không có tham số, ví dụ:Sử dụng void trong các hàm không có tham số?

class WinMessage 
{ 
public: 
    BOOL Translate(void); 
}; 

là không cần thiết, bạn cũng có thể chỉ cần viết Translate();.

Tôi, bản thân tôi thường bao gồm nó vì nó hữu ích một chút khi hỗ trợ hoàn thành mã hỗ trợ IDE hiển thị void, vì nó đảm bảo rằng chức năng này chắc chắn không có tham số.

Câu hỏi của tôi là, Đang thêm void vào các hàm ít tham số là một thực tiễn tốt? Nó có nên được khuyến khích trong mã hiện đại?

+3

Đó là một sự nôn nao từ C – Flexo

+4

@awoodland: "I có một nôn nao từ C. " Mhmm. Có vẻ phù hợp. ':)' – sbi

+0

Dưới đây là liên kết có thể giúp http://stackoverflow.com/questions/7412274/why-add-void-to-method-parameter-list –

Trả lời

18

Trong C++

void f(void); 

giống hệt:

void f(); 

Thực tế là phong cách đầu tiên vẫn có thể được viết một cách hợp pháp có thể là do C.
n3290 § C.1.7 (Tương thích C++ và ISO C) cho biết:

Thay đổi: Trong C++, một hàm được khai báo với một danh sách tham số trống mất không có đối số.

Trong C, danh sách tham số trống có nghĩa là số và loại đối số hàm không xác định.

Ví dụ:

int f(); // means int f(void) in C++ 
     // int f(unknown) in C 

Trong C, nó làm cho tinh thần để tránh điều đó không mong muốn "không rõ" ý nghĩa. Trong C++, nó không cần thiết.

Câu trả lời ngắn gọn: trong C++ đó là một sự nôn nao từ quá nhiều lập trình C. Điều đó đặt nó vào "không làm điều đó trừ khi bạn thực sự phải" khung cho C + + trong quan điểm của tôi.

+0

Có tương đương với 'int f()' của C trong C++ không? Tôi có nên sử dụng 'bên ngoài" C "' cho trường hợp sử dụng này không? – Spidey

+0

@Spidey tại sao bạn muốn làm điều đó? Đó là hành vi không xác định nếu bạn nhận được nó sai và một nôn nao di sản từ đầu C ngày để giảm phức tạp biên dịch/linker. Trong C++ 11, các mẫu variadic là một tính năng an toàn, hiện đại nhưng không phải là một tương đương trực tiếp. – Flexo

+0

Tôi đã sử dụng nó làm kiểu cho một mảng con trỏ hàm. Chúng tôi trao đổi các con trỏ mảng giữa mã máy khách và mã dll, và do đó tránh được các chức năng gọi dll liên tục. – Spidey

5

Tôi nghĩ rằng nó sẽ chỉ hỗ trợ tính tương thích ngược với mã C cũ hơn, nếu không nó sẽ dư thừa.

6

Tôi thấy hoàn toàn không có lý do cho việc này. Các IDE sẽ chỉ hoàn thành cuộc gọi hàm với một danh sách đối số trống và ít hơn 4 ký tự.

Cá nhân tôi tin rằng điều này khiến cho C++ đã tiết lộ chi tiết hơn. Không có phiên bản ngôn ngữ tôi biết về điều đó yêu cầu sử dụng void tại đây.

+8

Nếu bạn nghĩ rằng C++ là tiết, hãy thử Java. ':)' – sbi

2

I cảm thấy như không. Lý do:

  • Nhiều mã hơn có biểu mẫu BOOL Translate(), vì vậy những người khác đọc mã của bạn sẽ thoải mái và hiệu quả hơn.
  • Có ít trên màn hình (đặc biệt là một cái gì đó dư thừa như thế này) có nghĩa là suy nghĩ ít hơn cho ai đó đọc mã của bạn.
  • Đôi khi những người không đăng ký chương trình C vào năm 1988, hỏi "foo(void) có nghĩa là gì?"
+2

tại sao điều này lại bị giảm? –

0

Cũng giống như ghi chú bên. Một lý do khác để không bao gồm khoảng trống là phần mềm, như starUML, có thể đọc mã và tạo sơ đồ lớp, đọc khoảng trống làm tham số. Mặc dù điều này có thể là một lỗ hổng trong phần mềm tạo UML, vẫn khó chịu khi phải quay lại và loại bỏ các "khoảng trống" nếu bạn muốn có sơ đồ sạch

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