Void (kiểu dữ liệu)
Trong nhiều ngôn ngữ lập trình bắt nguồn từ C và Algol68, kiểu void (tiếng Anh: void type) là một kiểu kết quả của hàm nếu hàm này không trả về bất kì kết quả (giá trị) nào. Những hàm như thế thường được gọi trong chương trình vì những hiệu ứng biên của chúng. Các kiểu void có cùng mục đích với các cấu trúc cú pháp xác định các subroutine (đoạn chương trình con) trong Visual Basic và các procedure (thủ tục) trong ngôn ngữ lập trình Pascal. Trong những trường hợp như vậy, kiểu void có mục đích tương tự như kiểu unit (kiểu đơn vị) từ các ngôn ngữ lập trình hàm; tuy nhiên, có nhiều sự khác biệt trong các cách dùng được cho phép, như kiểu void được lấy làm kiểu rỗng và không có giá trị. Để dễ so sánh, xin hãy xem thêm đề mục Kiểu unit#Trong các ngôn ngữ lập trình.
Ngôn ngữ C và C++ cũng cung cấp con trỏ chỉ kiểu void (được đặc tả bởi void *
), nhưng đây là một khái niệm không có liên quan. Các biến kiểu này là các con trỏ chỉ đến dữ liệu của một kiểu chưa được xác định, vì thế ở ngữ cảnh này (nhưng không phải trong những ngữ cảnh khác) void đóng vai trò như một kiểu vạn năng hay kiểu top. Một chương trình có thể chuyển đổi một con trỏ chỉ đến kiểu bất kì của dữ liệu thành một con trỏ chỉ đến kiểu void và quay ngược lại kiểu ban đầu mà không làm mất thông tin, điều này khiến cho các con trỏ trở nên hữu ích trong các hàm đa hình (polymorphic function) (chú ý điều này không thật đúng đối với các con trỏ hàm vì các hàm không phải là dữ liệu[1]).
Lịch sử
[sửa | sửa mã nguồn]Trong số những ngôn ngữ lập trình hiện đại, từ khóa void lần đầu tiên xuất hiện trong C++ để hỗ trợ cho khái niệm con trỏ được tổng quát hóa. Tuy nhiên, nhờ sự vay mượn nhanh chóng từ C++, tài liệu tiêu chuẩn đầu tiên chứa từ khóa void đã trở thành chuẩn của ngôn ngữ C và đã được ANSI công bố vào năm 1989. Trong phạm vi ngôn ngữ C++, void đã được chuẩn hóa vào năm 1998.
Sau này, từ khóa void và những cấu trúc ngôn ngữ liên quan đến nó đã được thừa kế bởi các ngôn ngữ Java, C# và D.
Cú pháp
[sửa | sửa mã nguồn]Ngữ nghĩa
[sửa | sửa mã nguồn]Ngôn ngữ C trước khi có kiểu void
[sửa | sửa mã nguồn]Void trong các ngôn ngữ lập trình C và C++
[sửa | sửa mã nguồn]Một hàm có kiểu kết quả void kết thúc hoạt động bằng cách hoặc chạm tới điểm kết thúc của hàm hoặc thực hiện một lệnh trả về mà không có giá trị trả về. Kiểu void có thể cũng xuất hiện như là đối số (argument) duy nhất của một nguyên mẫu hàm (function prototype) nhằm xác định là hàm không có tham số nào cả. Chú ý rằng, mặc dù có tên, nhưng trong tất cả những trường hợp này, kiểu void được dùng làm kiểu unit, chứ không làm số 0 (zero) hay kiểu đáy, thậm chí không giống như một kiểu unit thực sự là kiểu đơn nhất, kiểu void bao gồm một tập hợp rỗng các giá trị, và ngôn ngữ không cung cấp bất cứ cách nào để khai báo một đối tượng hoặc biểu diễn một giá trị với kiểu void
.
Trong những phiên bản sớm nhất của C, các hàm không có kết quả xác định đã được mặc định kiểu trả về của int
và các hàm không có đối số đã dễ dàng có các danh sách đối số rỗng. Các con trỏ chỉ dữ liệu không được định kiểu đã được khai báo như là các số nguyên (integer) hoặc con trỏ chỉ char
. Một vài trình biên dịch C lúc ban đầu đã có đặc điểm mà ngày nay bị xem là phiền toái, đó là phát sinh cảnh báo cho bất kì lời gọi hàm nào không sử dụng giá trị trả về của hàm. Mã cũ đôi khi vứt bỏ những lời gọi hàm như vậy để tránh kết liễu cảnh báo này. Lúc Bjarne Stroustrup bắt đầu công trình của ông ấy trên C++ vào 1979-1980, void và con trỏ void đã từng là một phần của phương ngữ ngôn ngữ C được hỗ trợ bởi các trình biên dịch bắt nguồn từ AT&T.[2]
Việc sử dụng tường minh void và việc không cho các đối số ở trong một nguyên mẫu hàm có các ngữ nghĩa khác nhau trong C và C++, và được chi tiết hóa trong bảng sau đây:[3]
C++ | C tương đương |
---|---|
void f(); //được ưa thích hơn cả
|
void f(void);
|
void f(void);
|
void f(void);
|
void f(...); //Chấp nhận bất kì đối số nào
|
void f(); /*Chấp nhận bất kì đối số nào*/
|
Tuy nhiên, một nguyên mẫu C không lấy các đối số, ví dụ void f()
ở trên, đã bị phản đối trong C99.[4]
Tham khảo
[sửa | sửa mã nguồn]- ^ generic-function-pointers-in-c-and-void
- ^ "Standardisation."[liên kết hỏng]
- ^ Stroustrup, Bjarne (2009). Programming: Principles and Practice Using C++. Boston: Addison-Wesley. tr. 996. ISBN 0321543726.
- ^ Bjarne Stroustrup, C and C++: Case Studies in Compatibility. Reconcilable differences? You decide, Dr. Dobb's, ngày 1 tháng 9 năm 2002; print version Lưu trữ 2011-08-10 tại Wayback Machine