2010-06-14 39 views
5

Gần đây tôi đã gặp một quy ước mã hóa khá khác thường trong đó cuộc gọi cho hàm trả về "void" được bắt đầu bằng (void).Cần tiền tố hàm có dấu (void)

ví dụ:

(void) MyFunction(); 

Có bất kỳ khác biệt so với các cuộc gọi chức năng như:

MyFunction(); 

Có nó có bất kỳ lợi thế hay là nó chưa cần thiết khác nhưng có mã hóa ước của một số loại?

Trả lời

12

Một số hàm như printf() trả lại giá trị gần như không bao giờ được sử dụng trong mã thực (trong trường hợp printf, số ký tự được in). Tuy nhiên, một số công cụ, như lint, hy vọng rằng nếu một hàm trả về một giá trị của nó phải được sử dụng, và sẽ phàn nàn, trừ khi bạn viết một cái gì đó như:

int n = printf("hello"); 

sử dụng khoảng trống dàn diễn viên:

(void) printf("hello"); 

là một cách để nói những công cụ như vậy bạn thực sự không muốn sử dụng giá trị trả về, do đó giữ chúng yên lặng. Nếu bạn không sử dụng các công cụ như vậy, bạn không cần phải bận tâm, và trong mọi trường hợp, hầu hết các công cụ đều cho phép bạn cấu hình chúng để bỏ qua các giá trị trả về từ các hàm cụ thể.

+0

Tôi hiểu. Nhưng thế thì tại sao ai lại muốn làm điều này cho một chức năng đã trở về vô hiệu? – puffadder

+0

Chắc chắn, nhưng ông cho biết dàn diễn viên đã được thực hiện cho các chức năng mà trở về void. – Artefacto

+4

@puffadder Khi đoán, kiểu trả về của hàm đã được thay đổi tại một thời điểm nào đó, nhưng mã gọi lại thì không. –

2

Không, không có bất kỳ sự khác biệt nào - những gì đang được truyền để hủy là giá trị trả lại của hàm.

Tôi muốn nói rằng bạn có thể hiểu rõ rằng bạn không sử dụng giá trị trả về (bạn đang gọi nó cho các hiệu ứng phụ), nhưng khi hàm đã có khoảng trống, nó không ' t có ý nghĩa nhiều.

0

Nếu hàm trả về thứ gì đó void có thể tránh (!) Một cảnh báo (thực sự không có cách nào tôi có thể làm cho gcc cảnh báo rằng giá trị trả về bị mất) trên một số trình biên dịch (hoặc công cụ lint); nhưng quan trọng hơn, nó làm cho rõ ràng rằng một giá trị trả lại là "ném" đi cố ý (và không phải do nhầm lẫn).

0

acedemically: một "chức năng" luôn luôn trả về một cái gì đó, nếu không nó sẽ là một thủ tục. Vì vậy, Tác giả của mã này muốn nói "tôi biết việc đặt tên này là sai, nhưng tôi sẽ không thay đổi tên, vì vậy tôi có thể thấy sự xáo trộn này",

0

Nó có lợi thế hay không có mã hóa quy ước của một số loại?

Không có sự khác biệt. Đó là một quy ước khá phổ biến, ví dụ: trong kiểm thử phần mềm để làm nổi bật thực tế là trong bối cảnh hàm trả về, nếu có, an toàn để được loại bỏ.

0

Trong các trang của HPUX, nó khá phổ biến trong mã ví dụ để xem một diễn viên vô hiệu để có được xung quanh cảnh báo lint.

fprintf(mystream, "%s\n", "foo"); 

vs

(void)fprintf(mystream, "%s\n", "foo"); 

Đó có thể là nơi mà các tác giả của mã là đến từ. IMO, đây không phải là một ý tưởng tuyệt vời bởi vì hầu hết các gia đình sprintf, ví dụ, gọi malloc. malloc sẽ thất bại khi không có đủ bộ nhớ.SIGINT cũng gây ra hàm write() syscall bên dưới để ngắt và không ghi tất cả các bộ đệm, cho các thành viên gia đình printf().

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