Trong nhiều ngôn ngữ lập trình phát triển từ C và Algol68, kiểu dữ liệu void (tiếng Anh: void type) được sử dụng để chỉ các hàm không trả về bất kỳ giá trị nào. Các hàm này thường được gọi để thực hiện các tác động phụ. Kiểu void có chức năng tương tự như các cấu trúc xác định subroutine trong Visual Basic và procedure trong Pascal. Tuy nhiên, kiểu void thường được coi là kiểu rỗng không có giá trị, khác với kiểu unit trong các ngôn ngữ lập trình hàm. Để so sánh chi tiết, bạn có thể tham khảo mục Kiểu unit#Trong các ngôn ngữ lập trình.
C và C++ cũng hỗ trợ con trỏ kiểu void (được biểu thị bằng void *), nhưng đây là một khái niệm khác biệt. Con trỏ kiểu này có thể trỏ đến dữ liệu của bất kỳ kiểu nào chưa xác định, vì vậy trong ngữ cảnh này, void đóng vai trò như một kiểu vạn năng hoặc kiểu gốc. Một chương trình có thể chuyển đổi con trỏ từ bất kỳ kiểu dữ liệu nào thành con trỏ kiểu void và ngược lại mà không làm mất thông tin, điều này làm cho các con trỏ rất hữu ích trong các hàm đa hình. Tuy nhiên, điều này không hoàn toàn đúng với con trỏ hàm vì hàm không phải là dữ liệu.
Lịch sử
Trong các 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ợ khái niệm con trỏ tổng quát. Nhờ việc áp dụng 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 nhận vào năm 1989. Đối với ngôn ngữ C++, void đã được chuẩn hóa vào năm 1998.
Sau này, từ khóa void cùng với các cấu trúc ngôn ngữ liên quan đã được kế thừa bởi các ngôn ngữ như Java, C# và D.
Cú pháp
Ngữ nghĩa
Ngôn ngữ C trước khi kiểu void xuất hiện
Vai trò của kiểu void trong các ngôn ngữ lập trình C và C++
Một hàm có kiểu trả về void sẽ kết thúc khi nó đạt đến điểm cuối cùng của hàm hoặc khi thực hiện một lệnh trả về mà không có giá trị trả về. Kiểu void cũng có thể xuất hiện như là đối số duy nhất trong nguyên mẫu hàm để chỉ rõ rằng hàm không có tham số. Mặc dù có tên, kiểu void được sử dụng như một kiểu đơn vị (unit) thay vì số 0 hay kiểu đáy. Kiểu void không giống như một kiểu đơn vị thực sự, vì nó không bao gồm bất kỳ giá trị nào và ngôn ngữ không cho phép khai báo đối tượng hoặc biểu diễn giá trị với kiểu void.
Trong các phiên bản C đầu tiên, các hàm không có giá trị trả về được mặc định là kiểu int, và các hàm không có đối số thường được khai báo với danh sách đối số rỗng. Các con trỏ không được định kiểu đã được khai báo như là số nguyên hoặc con trỏ kiểu char. Một số trình biên dịch C đầu tiên đã cảnh báo khi có các lời gọi hàm mà không sử dụng giá trị trả về. Để tránh những cảnh báo này, mã cũ thường bỏ qua những lời gọi hàm đó. Khi Bjarne Stroustrup bắt đầu làm việc với C++ vào năm 1979-1980, kiểu void và con trỏ kiểu void đã là một phần của phương ngữ C được hỗ trợ bởi các trình biên dịch AT&T.
Việc sử dụng kiểu void và việc không có đối số trong nguyên mẫu hàm có các ý nghĩa khác nhau trong C và C++, và điều này được chi tiết hóa trong bảng dưới đây:
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, trong C99, nguyên mẫu hàm không có đối số, ví dụ như void f(), đã bị phản đối.
Các kiểu dữ liệu | |
---|---|
Không xác định |
|
Số |
|
Con trỏ |
|
Văn bản |
|
Phức hợp |
|
Khác |
|
Chủ đề liên quan |
|